0

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

public class ProjectNode extends AbstractNode {

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

}

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

private final ExplorerManager mgr = new ExplorerManager();

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

现在,我如何从某个节点获取 MainProject obj?我需要在另一个班级得到它。

4

1 回答 1

1

嗨,坏女孩/约瑟夫;-)

要回答您的问题的标题(与 netbeans 内部无关):

我认为这个问题回答了你的一些问题:查找是什么:检索一个或多个实现到提供的密钥,这通常是一个接口。

然后约瑟夫问:“哪个简单的模式可以代替这个反模式?”。您无法替换 NetBeans 平台中的查找模式,但要回答他的问题:我将使用依赖注入而不是通过手动布线、guice、pico 容器甚至 spring 在我的应用程序中查找。这样一个库的好处是您只需配置依赖项并从容器中检索正确配置的实例。看到这张漂亮的照片来感受一下。(大多数依赖注入工具也允许生命周期管理。)

举一个通过手动连接进行依赖注入的示例,假设以下类:

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);
}

但说实话:我更喜欢简单的依赖注入方式。阅读这篇介绍,他们还比较了查找和依赖注入(构造函数 + 设置器注入)。

有关更多信息,请阅读martin fowler 的这篇有趣的文章,该文章描述了服务定位器(查找)和控制反转(依赖注入)。阅读此处了解依赖注入的历史

于 2010-03-27T22:41:23.040 回答