我有 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?我需要在另一个类(class)得到它。
最佳答案
回答您问题的标题(与 netbeans 内部无关):
我认为 this question 回答了您的问题 what the lookup is 的一点点:检索所提供 key 的一个或多个实现,该 key 通常是一个接口(interface)。
然后约瑟夫问:“哪种简单模式可以取代这个反模式?”。 您无法替换 NetBeans 平台中的查找模式,但要回答他的问题:我会使用 dependency injection 而不是通过手动接线、guice、pico 容器甚至 spring 在我的应用程序中进行查找。 这种库的好处是您只需配置依赖项并从容器中检索正确配置的实例。请参阅 this nice picture 来感受一下。 (大多数依赖注入(inject)工具还允许生命周期管理。)
为了给出通过手动连接进行依赖注入(inject)的示例,假设以下类:
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);
}
但说实话:我更喜欢简单的依赖注入(inject)方式。阅读 this introduction,他们还比较了查找和依赖注入(inject)(构造函数 + setter 注入(inject))。
有关更多信息,请阅读 this interesting article from martin fowler,它描述了服务定位器(查找)和控制反转(依赖注入(inject))。阅读此处有关 history of dependency injection 的信息。
关于java - 查找是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2526758/