2011-04-05 55 views
0

最近在一個項目中,我看到另一個開發人員使用類名稱作爲引用調用JTree中的自定義節點,然後觸發JFrame中心區域(約束:每個節點只有一個面板)的Panel顯示。設計:使用類或實例引用?

我可以理解樹中類名的使用,因爲沒有太多的顯示正在進行。但是,我傾向於在樹本身中使用一個實例,它也可以爲JPanel創建動畫。什麼是最普遍的做法,哪種方法比另一種更合適?

編輯:根據要求添加代碼。似乎我誤解了一些事情,因爲有一些脫鉤。

枚舉表示JPanels的一種硬編碼註冊表,當用戶執行操作時顯示JPanel。這就是我使用實際的類名稱的意思。

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類的方法,它從enum中重新創建一個自定義JPanel。一個MouseAdapter/KeyListener的內部

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; 
} 

方法,獲取某種模型對象:

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有沒有什麼有趣的,只是重現從模型類節點。

+3

我迷失在你的描述中。你可以發佈一些粗略的代碼或舉個例子嗎? – jzd 2011-04-05 18:15:44

+0

根據你的描述,我相信你正在混合「優雅」和「蹩腳」。代碼將清除我對你所描述的技術的理解。 – DwB 2011-04-05 18:32:17

+0

哈哈,我應該工作我的描述技能。我已經添加了一些用於說明目的的代碼:)。 – 2011-04-05 19:19:46

回答

1

這仍然有點難以遵循,但我相信你的方法可能會更好。如果存儲的類實例也可以進行顯示,那麼這是一個很好的方法。

每當你添加一層「元」 - 使用反射 - 你真的應該有一個很好的理由這樣做,因爲它稍微加密了你的代碼。通常反射的最佳用途可能是從非java文本或xml文件中加載對象,即使這樣它也有助於在單個工廠方法內隔離反射部分,並返回不使用任何進一步反射的實例化Java對象。

但要小心,優雅和蹩腳的話。通常人們稱之爲優雅的,我稱之爲「更隱祕」,蹩腳通常也是「更隱祕」。

即使您的代碼寫得有點長或無趣,您的目標應始終爲「更易讀」。其實我會說「完全正確」是最重要的,緊隨其後的是「更易讀」(這意味着一定程度的簡潔,太多的代碼可能難以閱讀過於「優雅」的代碼)。