Как работает поиск?

У меня есть BeanTreeView и некоторые узлы в нем. У каждого узла есть конструктор

public class ProjectNode extends AbstractNode {

public ProjectNode(MainProject obj, DiagramsChildren childrens) {
    super (new ProjectsChildren(), Lookups.singleton(obj));
    setDisplayName ( obj.getName());

}

Я установил Rootnode в качестве корня для дерева в ExplorerTopComponent следующим образом:

private final ExplorerManager mgr = new ExplorerManager();

public ExplorerTopComponent() {
    associateLookup (ExplorerUtils.createLookup(mgr, getActionMap()));
    mgr.setRootContext(new RootNode());
}

А теперь, как я могу получить MainProject obj с какого-то узла? Мне нужно получить его в другом классе.

1 ответ

Привет, девица / Джозеф;-)

Чтобы ответить на заголовок вашего вопроса (ничего о внутренностях netbeans):

Я думаю, что этот вопрос немного отвечает на ваш вопрос о поиске: извлечение одной или нескольких реализаций в предоставленный ключ, который обычно является интерфейсом.

Затем Джозеф спросил: "Какой простой образец может заменить этот анти образец?". Вы не можете заменить шаблон поиска в платформе NetBeans, но ответив на его вопрос: я бы использовал внедрение зависимостей вместо поиска в своем приложении через ручную разводку, подсказку, пико-контейнер или даже пружину. Приятной особенностью такой библиотеки является то, что вы настраиваете только зависимости и извлекаете правильно сконфигурированные экземпляры из контейнера. Посмотрите эту красивую картинку, чтобы почувствовать это. (Большинство инструментов внедрения зависимостей позволяют также управлять жизненным циклом.)

Чтобы дать пример для внедрения зависимости через ручное соединение, предположим следующий класс:

class Path {
    List edges = new ArrayList();
    public void setEdges(List e) {
     edges = e;
    }
}

Теперь вы можете легко переключать реализацию ArrayList с помощью LinkedList:

p = new Path();
p.setEdges(new LinkedList());

С концепцией поиска это не так просто (но я не уверен):

class Path {
  List edges = Lookup.create(List.class);
}

Теперь использование с заменой связанного списка прямо:

Lookup.set(List.class, LinkedList.class);
p = new Path();    

но проблема в следующем: как бы вы использовали lookup, если у вас есть несколько разных классов, которым требуется реализация List?

Вы реализуете свой поиск в зависимости от класса, который его использует:

class Path {
  List edges = Lookup.get(Path.class).create(List.class);
}

Но, честно говоря: я предпочитаю простой способ внедрения зависимостей. Прочитайте это введение, где они также сравнили поиск и внедрение зависимостей (конструктор + установка сеттера).

Для получения дополнительной информации прочитайте эту интересную статью от Мартина Фаулера, которая описывает сервисные локаторы (поиск) и инверсию управления (внедрение зависимостей). Читайте здесь об истории внедрения зависимостей.

Другие вопросы по тегам