7

我很难理解这一点。基本上,这个 Lookup API 用于保持松散耦合的模块间性质。所以基本上服务提供者和消费者模块都可以使用 Lookup API 相互通信,对吗?

但我不明白的是:

Lookup 是不是一个装满该类对象的袋子?有人可以给出一个更简单的类比吗?

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

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

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

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

  1. 在 TopComponent(视图)中,您实现了 Lookup Listener 和 action Listener。
  2. 您制作了一个新对象(来自另一个模块)
  3. associateLookup(Lookups.singleton(fff));再次混淆这一行:associateLookup()到底在做什么?
  4. result = Utilities.actionsGlobalContext().lookupResult(Browser1.class);这条线在做什么?结果是什么?它是否包含 Browser1 类(来自其他模块)?
  5. result.addLookupListener (this); 为什么要将侦听器添加到 result ?我们在听什么以及为什么在 TopComponent 上?

  6. 完毕 ?

最后,为了进一步加深我的困惑,Node API 是如何发挥作用的?

4

2 回答 2

5

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

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

这将为您提供所有饮料供应商的列表,而无需声明对特定类的确切依赖关系或对该模块的依赖关系。这很好,您的代码不依赖于特定的实现,将这些模块放在类路径上就足够了,它们会“自动神奇地”加载到您的应用程序中。

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

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

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

Utilities.actionsGlobalContext()与当前选定的(活动的)有关TopCompomentBeverage.class如果它存在于活动组件中,它将返回一个实例。如果你想要给定类的所有实例,你应该使用lookupAll().

result.addLookupListener(this);为什么要将侦听器添加到 result ?

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

void resultChanged(LookupEvent ev);

并将result.allInstances();返回选择了哪些实例。

于 2015-02-10T22:23:44.077 回答
3

对 NetBeans 平台 Lookup API进行了很好的讨论

于 2010-07-11T14:52:57.300 回答