2012-06-25 3 views
0

확장 가능한 노드 - 종류 접근 방식을 작성하는 방법에 대해 생각하고 있습니다. 현재 트리 구조의 각 노드는 노드의 종류 (노드의 종류에 따라 디스크의 노드를 직렬화 및 비 직렬화하는 방법을 정의하는 enum)를 반환하는 메서드를 구현해야합니다. 사용자가 프레임 워크를 사용하고 다른 노드 유형을 정의 및 구현하려면 일부 확장 성이 필요합니다. 확장 가능 enum

나는 인터페이스 (확장 열거 패턴)을 추가하고

public interface IKind 추천하고 public <E extends Enum<E> & IKind> E getKind() {...} 같은 노드 인터페이스를 사용 뭔가 somethink 사용에 대해 생각했다. 그러나 나는 그 확인의 경우도 확실하지 않다 : ElementNode (XML) 및 IKind를 구현하는 열거 e 노드에 대한

@Override 
public <T extends Enum<T> & IKind> T getKind() { 
    return (T)ENode.ELEMENT_KIND; 
} 

. 또한 노드 유형을 전환 할 수 없으며, 이는 매번 방문자 구현을 작성하지 않으려 고하는 것처럼 어쨌든 살인자 인수로 간주됩니다.

현재의 구현은 간단하다 : 나는 현재 트리 구조의 간단한 PathSynopsis를 작성하고, 따라서 나는 핵심 노드에 추가하지 않으 PathNodes를 사용하고있어

@Override 
public ENode getKind() { 
    return ENode.ELEMENT_KIND; 
} 

.

BTW : switch-statement에 사용할 enum (value)의 종류를 반환 할 수 있습니까? ... Enum을 사용할 수 없으므로 전환 할 수 없습니다.

아마도 사용될 수도 직렬화/역 직렬화 nontheless 사용되는 간단한 바이트 값을 반환하지만 추한 비트이다 :

switch (ENode.getKind(pNewRtx.getNode().getKind()))

public enum ENode implements IKind { 
    ELEMENT((byte) 0, ElementNode.class) { 
    serialize(...) {...} 
    deserialize(...) {...} 
    } 
    ... 
    /** Mapping of keys -> nodes. */ 
    private static final Map<Byte, ENode> INSTANCEFORID = new HashMap<>(); 

    /** Mapping of class -> nodes. */ 
    private static final Map<Class<? extends INode>, ENode> INSTANCEFORCLASS = new HashMap<>(); 

    static { 
    for (final ENode node : values()) { 
     INSTANCEFORID.put(node.mId, node); 
     INSTANCEFORCLASS.put(node.mClass, node); 
    } 
    } 
    ... 
    /** 
    * Get the related node based on the identifier. 
    * 
    * @param pId 
    *   the identifier for the node 
    * @return the related node value 
    */ 
    public static ENode getKind(final byte pId) { 
    return INSTANCEFORID.get(pId); 
    } 

public interface IKind { 
    /** 
    * Deserializing a node using a {@link ITTSource}. 
    * 
    * @param pSource 
    *   input source 
    * @return a {@link INode} instance 
    */ 
    INode deserialize(final ITTSource pSource); 

    /** 
    * Serializing a node from a {@link ITTSink}. 
    * 
    * @param pSink 
    *   where the data should be serialized to 
    * @param pToSerialize 
    *   the node to serialize 
    */ 
    void serialize(final ITTSink pSink, final INode pToSerialize); 

    /** 
    * Get the nodeKind. 
    * 
    * @return the unique kind 
    */ 
    byte getKind(); 
} 

그러나 이것은 intr NPE에 대한 가능성을 줄이고 구현자는 바이트 값이 구현간에 동일하지 않도록해야합니다.

답변

4

열거 형을 쓸 때 대개 열거 형을 구성합니다. 나는 그들이 역동적 이어야만한다면 그 길로 가지 않을 것입니다. 나는 공통 인터페이스와 다형성의 관점에서 생각할 가능성이 더 높습니다.

+0

지금까지는 XML 문서를 저장할 수있는 폐쇄 형 세트 였지만 어떤 종류의 트리 구조로 된 문서를 지속적으로 개정하기위한 프레임 워크로서의 가치가 있다고 생각합니다. – Johannes

+0

열거 형을 사용하지 않을 것입니다. , 그 다음. 나는 당신의 아이디어에 동의하지 않고 단지 귀하의 선택을 구현합니다. 나는 그것이 enum의 목적에 어긋나는 것이라고 생각한다. – duffymo

+0

실제로 위에서 설명한 방법으로 두 사람이 옳습니다. 이 메소드는 인터페이스 콜렉션을 취합니다. enum은 인터페이스 구현의 기본 세트를 제공합니다. 모두가 이긴다. –