设计:使用类或实例引用?

时间:2011-04-05 18:13:34

标签: java class swing object

最近在一个项目中,我看到另一个开发人员使用类名作为引用从JTree调用自定义节点,然后在JFrame的中心区域触发Panel的显示(约束:每个节点一个且只有一个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 个答案:

答案 0 :(得分:1)

这仍然有点难以理解,但我相信你的方法可能更好。如果存储的类实例也可以进行显示,那么这是一个很好的使用方法。

每当你添加一层“Meta” - 使用反射 - 你真的应该有一个很好的理由这样做,因为它会加密你的代码。反射的最佳用途可能是从非java文本或xml文件加载对象,即使这样,它也有助于隔离单个工厂方法中的反射部分,并返回不使用任何进一步反射的实例化java对象。 / p>

但要注意优雅和蹩脚的话。通常人们称之为优雅,我称之为“更隐秘”,而蹩脚的通常也是“更加神秘”。

你的目标应该始终是“更容易阅读”,即使你的代码写得更长一点也不那么有趣。实际上我说“完全因素”是最重要的,紧接着是“更易读”(这意味着某种程度的简洁,太多的代码可能像过于“优雅”的代码一样难以阅读)。