什么是netbean的Lookup?

KJW*_*KJW 7 java netbeans netbeans-platform

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

但我不明白的是:

Lookup就像一个装满那个类的对象的包?有人可以给出一个更简单的类比吗?

那么创建依赖关系,并在服务使用者中实现LookupListener是否正确?消费者显然依赖提供者.

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

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

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

  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); 为什么要为结果添加监听器?我们在TopComponent上正在倾听什么以及为什么?

  6. 做完了?

最后,为了进一步让我感到困惑,Node API如何进入pla7y?

Tom*_*art 5

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

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

public interface Beverage {
   ...
}
Run Code Online (Sandbox Code Playgroud)

然后是另一个beers依赖于的模块beverage-api

@ServiceProvider(service = Beverage.class)
public class SomeBeer implements Beverage {
   ...
}
Run Code Online (Sandbox Code Playgroud)

在另一个也取决于beverage-api您的模块中,您可以编写一个神奇的公式:

Collection list = Lookup.getDefault().lookupAll(Beverage.class);
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

result.addLookupListener(this); 为什么要在 result 中添加监听器?

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

void resultChanged(LookupEvent ev);
Run Code Online (Sandbox Code Playgroud)

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


vkr*_*mer 3

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