Стоит ли использовать instanceof, если в JTree несколько разных объектов?

В моем JTree дереве существует несколько разных видов объектов (6 штук).
Для работы разных объектов нужны совершенно разные методы.
У каждого класса около десятка своих полей.
<code lang="java">
DefaultMutableTreeNode node = (DefaultMutableTreeNode) tree.getModel().getChild(currentNode, i);
    Object ob = node.getUserObject();
    if(ob instanceof DescriptionTemplate) {
        // todo...
    }
</code>

Насколько оправдано использование использование оператора instanceof в этом случае?
При использовании instanceof образуется большое количество ветвлений.

Можно ли решить эту проблему другим способом?
  • Вопрос задан
  • 2839 просмотров
Пригласить эксперта
Ответы на вопрос 2
Losted
@Losted
Software Architect
Как насчет общего интерфейса с методом getType()?
Ответ написан
@paralainer
Не стоит забывать про возможность использования стратегий.

Очень приблизительный код, но суть ясна:
private static final Map<Class, Action> strategies = new HashMap<>();
    
    private static interface Action {
         void doAction(Params params);
    }
    
    static {
        strategies.put(ANodeType.class, new Action() {
            public void doAction(Params params){
                 ...
            } 
        });

        strategies.put(BNodeType.class, new Action() {
            public void doAction(Params params){
                 ...
            } 
        });
    }
    
    ...
    
    public void handleTreeNode(Object node, Params params){
       strategies.get(node.getClass()).doAction(params);
    }


А вообще есть вариант реализовать всеми типами нод интерфейс Action (переименовав его, например, в JTreeNode) и выглядеть это будет примерно так:

public void handleTreeNode(JTreeNode node, Params params){
       node.doAction(params);
    }


Но тут нужно смотреть возможно ли изменить код классов, которые хранятся в дереве и насколько это будет архитектурно правильно. (Специальные ли это объекты для дерева или общие объекты системы)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы