Вы можете рассматривать Lookups как базовый инструмент, поддерживающий принцип высокой когезии слабой связи .
В основном у вас есть API в модуле beverage-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()
относится к выбранному в данный момент (активному) TopCompoment
.Он вернет экземпляр Beverage.class
, если он существует в активном компоненте.Если вам нужны все экземпляры данного класса, вы должны использовать lookupAll()
.
result.addLookupListener(this);
Зачем вам добавлять слушателя в результат?
Для получения уведомления об изменениях.Когда пользователь выбирает некоторые объекты Beverages
, он запускает метод LookupListener
:
void resultChanged(LookupEvent ev);
и result.allInstances();
возвращает, какие экземпляры были выбраны.