2010-03-26 8 views
0

J'ai BeanTreeView, et quelques noeuds dedans. Chaque noeud a constructeurComment fonctionne la recherche?

public class ProjectNode extends AbstractNode { 

public ProjectNode(MainProject obj, DiagramsChildren childrens) { 
    super (new ProjectsChildren(), Lookups.singleton(obj)); 
    setDisplayName (obj.getName()); 

} 

Je mets RootNode comme racine pour arbre ExplorerTopComponent comme ceci:

private final ExplorerManager mgr = new ExplorerManager(); 

public ExplorerTopComponent() { 
    associateLookup (ExplorerUtils.createLookup(mgr, getActionMap())); 
    mgr.setRootContext(new RootNode()); 
} 

Et maintenant, comment je peux obtenir MainProject obj de quelque nœud? Je dois l'obtenir dans une autre classe.

Répondre

1

Hi badgirl/Joseph ;-)

Pour répondre à titre de votre question (rien NetBeans internals):

Je pense que this question répond un peu de votre question what the lookup is: récupérer un ou plusieurs à la mise en œuvre prévue clé qui est normalement une interface. Puis Joseph demanda: «quel motif simple peut remplacer cet anti-pattern?». Vous ne pouvez pas remplacer le modèle de recherche dans la plate-forme NetBeans, mais pour répondre à sa question: J'utiliserais dependency injection au lieu de rechercher dans mon application via le câblage manuel, guice, pico conteneur ou même le printemps. La bonne chose à propos d'une telle bibliothèque est que vous configurez seulement les dépendances et récupérez les instances correctement configurées à partir du conteneur. Voir this nice picture pour avoir une idée de cela. (les outils les plus d'injection de dépendance permettent également la gestion du cycle de vie.)

Pour donner un exemple pour l'injection de dépendance par le câblage à la main assumer la classe suivante:

class Path { 
    List edges = new ArrayList(); 
    public void setEdges(List e) { 
    edges = e; 
    } 
} 

Maintenant, vous pouvez facilement passer la mise en œuvre ArrayList avec LinkedList:

p = new Path(); 
p.setEdges(new LinkedList()); 

Avec le concept de recherche ce n'est pas aussi facile (mais je ne suis pas sûr):

class Path { 
    List edges = Lookup.create(List.class); 
} 

Maintenant, l'utilisation avec le remplacement de la liste chaînée est simple:

Lookup.set(List.class, LinkedList.class); 
p = new Path();  

mais le problème est: Comment utiliseriez-vous recherche si vous avez plusieurs classes différentes qui a besoin d'une mise en œuvre de la liste?

vous implémentez votre recherche en fonction de la classe qui l'utilise:

class Path { 
    List edges = Lookup.get(Path.class).create(List.class); 
} 

Mais pour être honnête: je préfère la manière simple d'injection de dépendance. Lire this introduction où ils ont également comparé la recherche et l'injection de dépendance (constructeur + injection de setter).

Pour plus d'informations, veuillez lire this interesting article from martin fowler qui décrit les localisateurs de service (recherche) et l'inversion de contrôle (injection de dépendance). Lisez ici à propos du history of dependency injection.

Questions connexes