我无法理解这一点。基本上,此Lookup API用于保持松散耦合的模块间性质。那么基本上服务提供者和消费者模块可以使用Lookup API正确地相互通信吗?
但我不明白的是:
Lookup就像一个装满该类的对象的包?有人可以给出一个更容易的比喻吗?
因此创建了依赖项,并且您在服务使用者中实现LookupListener是否正确?消费者显然依赖提供者。
那么LookupListener的实现是什么?这是自己的Lookup?那么如果有另一个模块的类的映射,它将作为一个对象存储在Lookup的Lookup中实现LookupListener?
所以查找有点像一个可以存储另一个模块的类及其方法的包吗?
这是确定选择的正确过程吗?
associateLookup(Lookups.singleton(fff));
,对这一行感到困惑:associateLookup()
到底在做什么?result = Utilities.actionsGlobalContext().lookupResult(Browser1.class);
这条线在做什么?结果是什么?它是否包含Browser1类(来自其他模块)? result.addLookupListener (this)
;为什么要为结果添加监听器?我们在TopComponent上听什么以及为什么要这样做?
完成了吗?
最后,为了让我更加困惑,Node API如何进入pla7y?
答案 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)