Дизайн: Использовать ссылки на класс или экземпляр? - PullRequest
0 голосов
/ 05 апреля 2011

Недавно в проекте я видел, как другой разработчик вызывал пользовательские узлы из JTree, используя имя класса в качестве ссылки, чтобы затем запустить отображение Panel в центральной области JFrame (ограничение: одна и только одна Panel на узел).

Я могу понять использование имен классов в дереве, так как отображение не происходит.Однако я склонен использовать экземпляр в самом дереве, который также может анимировать JPanel.Какова наиболее распространенная практика и в каких случаях один подход будет более подходящим, чем другой?

Редактировать: Код добавляется по запросу.Кажется, я неправильно запомнил некоторые вещи, поскольку произошла некоторая развязка.

Перечисление представляет собой некий жестко закодированный реестр для JPanels, который отображается, когда пользователь выполняет манипуляцию.Это то, что я имею в виду, используя фактические имена классов.

public enum RightEnum {
    BLAH1(BLAH1.class, "BLAH1", "This is a custom JPanel"),
    BLAH2(BLAH2.class, "BLAH2", "This is another custom JPanel")
    // etc

    private Class<? extends AbstractWidget> widgetClass;
    private String key; 
    private String label;


    RightEnum(Class<? extends AbstractWidget> widgetClass, String key, String label) {
        this.widgetClass = widgetClass;
        this.key = key;
        this.label = label;
    }

    public String getLabel() {
        return label;
    }

    public String getKey() {
        return key;
    }

    public Class<? extends AbstractWidget> getWidgetClass() {
        return widgetClass;
    }

    public static RightEnum getEnum(String key) {
        if(key == null) {
            return null;
        }
        for(RightEnum right : RightEnum.values()) {
            if(right.key.equals(key)) {
                return right;
            }
        }
        return null;
    }
}

Метод из класса Swing, который воссоздает пользовательский JPanel из перечисления.

private static AbstractWidget createWidget(Right right) throws Exception {
    RightEnum rightEnum = RightEnum.getEnum(right.getKey());
    Class<? extends AbstractWidget> widgetClass = rightEnum.getWidgetClass();
    AbstractWidget widget = (AbstractWidget) widgetClass.newInstance();
    widget.setRight(right);
    return widget;
}

Метод внутри MouseAdapter / KeyListener, которыйвыбирает какой-то объект модели:

private void doOpenView() throws Exception {
        NavigationTreeNode navNode = (NavigationTreeNode) CustomFrame.navigationMenu.getLastSelectedPathComponent();
        if (navNode.isLeaf()) {
            if(navNode.getObject() instanceof Right) {
                Right right = (Right) navNode.getObject();
                try {
                    CustomFrame.widgetContainer.createAndAddWidget(right);                  
                } catch (Exception ex) {
                    throw ex;
                }
            }
        }
    }

Фактический JTree не имеет ничего особенного и просто воссоздает узлы из классов модели.

1 Ответ

1 голос
/ 05 апреля 2011

Все еще немного трудно следовать, но я считаю, что ваш подход, вероятно, лучше. Если сохраненный экземпляр класса также может отображать данные, это отличный метод для использования.

Всякий раз, когда вы добавляете слой "Meta" - используя отражение - у вас действительно должна быть веская причина для этого, потому что он немного шифрует ваш код. В общем случае для отражения лучше всего использовать загрузку объектов из текстовых или XML-файлов, не относящихся к Java, и даже в этом случае это помогает изолировать отражающие части внутри одного метода фабрики и возвращать экземпляры Java-объектов, которые не используют дальнейшее отражение.

Будьте осторожны, однако, со словами элегантный и дерьмовый. Часто то, что люди называют элегантным, я бы назвал «Более загадочным», а дерьмовый обычно также «Более загадочным».

Ваша цель всегда должна быть «более читабельной», даже если ваш код будет немного длиннее или чуть менее увлекательным для написания. На самом деле, я бы сказал, что «Fully Factored» является наиболее важным, за ним следует «More Readable» (что подразумевает некоторый уровень краткости, слишком много кода может быть таким же трудным для чтения, как и чрезмерно «элегантный» код).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...