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

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

0 голосов
/ 27 марта 2010

У меня есть 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 Ответ

1 голос
/ 28 марта 2010

Привет, плохая девчонка / Джозеф ; -)

Чтобы ответить на заголовок вашего вопроса (ничего о внутренностях 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();    

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

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

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

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

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

...