查找如何工作?

时间:2010-03-26 21:07:42

标签: java netbeans openide

我有BeanTreeView,还有一些节点。每个节点都有构造函数

public class ProjectNode extends AbstractNode {

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

}

我在ExplorerTopComponent中将Rootnode设置为树的根,如下所示:

private final ExplorerManager mgr = new ExplorerManager();

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

现在,我如何从某个节点获取MainProject obj?我需要在另一堂课中获得它。

1 个答案:

答案 0 :(得分:1)

Hi badgirl/Joseph; - )

回答你问题的标题(没有关于netbeans内部成员):

我认为this question回答了一些问题what the lookup is:检索一个或多个实现到提供的密钥,通常是一个接口。

然后约瑟夫问:'哪种简单的模式可以取代这种反模式?'。 您不能替换NetBeans平台中的查找模式,而是回答他的问题:我会使用dependency injection而不是通过手工布线,guice,微型容器甚至弹簧在我的应用程序中查找。 关于这样一个库的好处是你只需配置依赖项并从容器中检索正确配置的实例。请参阅this nice picture以了解这一点。 (大多数依赖注入工具也允许生命周期管理。)

通过手工布线给出依赖注入的示例,假设以下类:

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

现在,您可以使用LinkedList轻松切换ArrayList实现:

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

使用查找概念并不容易(但我不确定):

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

现在,链接列表替换的使用是直截了当的:

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

但问题是:如果你有几个需要List实现的不同类,你将如何使用查找?

根据使用它的类实现查找:

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

但说实话:我更喜欢简单的依赖注入方式。阅读this introduction,他们还比较了查找和依赖注入(构造函数+ setter注入)。

有关更多信息,请阅读this interesting article from martin fowler,其中描述了服务定位器(查找)和控制反转(依赖注入)。请在此处阅读history of dependency injection