2011-04-05 5 views
0

최근 프로젝트에서 나는 클래스 이름을 참조로 사용하는 JTree에서 다른 개발자가 사용자 정의 노드를 호출하여 JFrame의 중앙 영역에서 Panel의 표시를 트리거하는 것을 보았습니다 (제약 조건 : 노드 당 단 하나의 Panel).디자인 : 클래스 또는 인스턴스 참조를 사용 하시겠습니까?

계속 진행되는 표시가 많지 않으므로 클래스 이름 사용을 이해할 수 있습니다. 그러나 JPanel을 움직일 수있는 트리 자체의 인스턴스를 사용하는 경향이 있습니다. 가장 널리 퍼진 관행은 무엇이며 어떤 경우에는 다른 관행보다 더 적절하게 접근 하는가?

편집 : 요청시 코드가 추가되었습니다. 감추고있는 것의 약간이 있었던 것에 따라 나는 물건을 잘못 잊었던 것처럼 보인다.

enum은 사용자가 조작을 수행 할 때 표시되는 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; 
    } 
} 

enum에서 사용자 지정 JPanel을 다시 만드는 Swing 클래스를 포함하는 메서드입니다. 모델 객체의 일종을 가져 오는 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

+0

귀하의 설명에 따르면, 나는 당신이 "우아하고"엉터리라고 생각합니다. 코드는 설명하는 기술에 대한 나의 이해를 명확하게합니다. – DwB

+0

하하하. 설명 기술을 습득해야합니다. 일러스트레이션을 위해 몇 가지 코드를 추가했습니다 :). –

답변

1

따라하기가 다소 어려울 지 모르지만 귀하의 접근 방법이 더 좋을 것으로 생각됩니다. 저장된 클래스 인스턴스가 표시 작업을 수행 할 수있는 경우 사용할 수있는 좋은 방법입니다.

리플렉션을 사용하여 "Meta"레이어를 추가 할 때마다 코드를 약간 암호화하기 때문에 그렇게해야 할 큰 이유가 있습니다. 리플렉션을 위해 일반적으로 최선의 사용은 아마도 자바가 아닌 텍스트 또는 XML 파일에서 객체를로드하는 것입니다. 그러면 단일 팩토리 메소드 내에서 반사 부분을 격리하고 더 이상의 리플렉션을 사용하지 않는 인스턴스화 된 Java 객체를 반환하는 데 도움이됩니다.

그러나 우아하고 엉성한 단어는주의해야합니다. 종종 사람들이 "더 Cryptic"이라고 부르는 우아한 것을 부르는 것이고, 시시한 것은 일반적으로 "More Cryptic"이라고도합니다.

코드가 좀 더 길거나 재미가 적더라도 목표는 항상 "더 읽기 쉽도록"설정해야합니다. 실제로 "Fully Factored"가 가장 중요하며, "Read Readable"(간결함을 의미 함), 너무 많은 코드는 지나치게 "우아한"코드처럼 읽기 어려울 수 있습니다.

관련 문제