什么是netbean的Lookup?

时间:2010-07-11 05:03:45

标签: java netbeans netbeans-platform

我无法理解这一点。基本上,此Lookup API用于保持松散耦合的模块间性质。那么基本上服务提供者和消费者模块可以使用Lookup API正确地相互通信吗?

但我不明白的是:

Lookup就像一个装满该类的对象的包?有人可以给出一个更容易的比喻吗?

因此创建了依赖项,并且您在服务使用者中实现LookupListener是否正确?消费者显然依赖提供者。

那么LookupListener的实现是什么?这是自己的Lookup?那么如果有另一个模块的类的映射,它将作为一个对象存储在Lookup的Lookup中实现LookupListener?

所以查找有点像一个可以存储另一个模块的类及其方法的包吗?

这是确定选择的正确过程吗?

  1. 在TopComponent(view)中实现了Lookup Listener和action Listener。
  2. 你创建了一个新对象(来自其他模块)
  3. 再次
  4. associateLookup(Lookups.singleton(fff));,对这一行感到困惑:associateLookup()到底在做什么?
  5. result = Utilities.actionsGlobalContext().lookupResult(Browser1.class);这条线在做什么?结果是什么?它是否包含Browser1类(来自其他模块)?
  6. result.addLookupListener (this);为什么要为结果添加监听器?我们在TopComponent上听什么以及为什么要这样做?

  7. 完成了吗?

  8. 最后,为了让我更加困惑,Node API如何进入pla7y?

2 个答案:

答案 0 :(得分:4)

您可以将Lookup视为支持松散耦合高内聚原则的基本工具。

基本上,您在beverage-api模块中有一个API:

public interface Beverage {
   ...
}

然后另一个模块beers取决于beverage-api

@ServiceProvider(service = Beverage.class)
public class SomeBeer implements Beverage {
   ...
}

在另一个依赖于beverage-api的模块中你可以编写一个神奇的公式:

Collection list = Lookup.getDefault().lookupAll(Beverage.class);

它将为您提供所有饮料提供商的列表,而不会声明对特定类的确切依赖性或依赖于该模块。这很好,你的代码不依赖于具体的实现,它足以让这些模块在类路径上,并且它们将自动地魔法地#34;加载到您的应用程序中。

  

associateLookup(Lookups.singleton(fff));再次与这一行混淆:associateLookup()究竟在做什么?

是的,令人困惑。基本上你手动将一些对象添加到查找系统。

  

result = Utilities.actionsGlobalContext().lookupResult(Beverage.class);

Utilities.actionsGlobalContext()与当前选定的(有效)TopCompoment相关。如果它存在于活动组件中,它将返回Beverage.class的实例。如果您想要所有给定类的实例,则应使用lookupAll()

  

result.addLookupListener(this);为什么要将监听器添加到结果中?

获取有关更改的通知。当用户选择一些Beverages个对象时,它会触发LookupListener方法:

void resultChanged(LookupEvent ev);

result.allInstances();将返回选择的实例。

答案 1 :(得分:3)