확장 가능한 노드 - 종류 접근 방식을 작성하는 방법에 대해 생각하고 있습니다. 현재 트리 구조의 각 노드는 노드의 종류 (노드의 종류에 따라 디스크의 노드를 직렬화 및 비 직렬화하는 방법을 정의하는 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에 대한 가능성을 줄이고 구현자는 바이트 값이 구현간에 동일하지 않도록해야합니다.
지금까지는 XML 문서를 저장할 수있는 폐쇄 형 세트 였지만 어떤 종류의 트리 구조로 된 문서를 지속적으로 개정하기위한 프레임 워크로서의 가치가 있다고 생각합니다. – Johannes
열거 형을 사용하지 않을 것입니다. , 그 다음. 나는 당신의 아이디어에 동의하지 않고 단지 귀하의 선택을 구현합니다. 나는 그것이 enum의 목적에 어긋나는 것이라고 생각한다. – duffymo
실제로 위에서 설명한 방법으로 두 사람이 옳습니다. 이 메소드는 인터페이스 콜렉션을 취합니다. enum은 인터페이스 구현의 기본 세트를 제공합니다. 모두가 이긴다. –