我正在考虑如何编写一种可扩展的节点类方法。目前,树结构中的每个节点都必须实现一个返回节点类型的方法(目前是一个枚举,它定义了如何根据节点的类型在磁盘上序列化和反序列化节点)。如果用户想要使用框架并定义和实现其他节点类型,我们需要一些可扩展性。
我考虑添加一个接口(可扩展枚举模式),并使用如下所示的方法
public interface IKind和在节点接口中使用类似于public <E extends Enum<E> & IKind> E getKind() {...}的东西。然而,我甚至不确定这是否可以:
@Override
public <T extends Enum<T> & IKind> T getKind() {
return (T)ENode.ELEMENT_KIND;
}用于ElementNode (XML)和实现IKind的枚举ENode。此外,它不允许打开节点的类型,这似乎是一个致命的参数,因为一个人可能不想每次都编写一个访问者实现。
当前的实现很简单:
@Override
public ENode getKind() {
return ENode.ELEMENT_KIND;
}我目前正在编写一个简单的树形结构的PathSynopsis,因此使用PathNodes,我不想将其添加到核心节点。
顺便说一下:有没有可能返回任何类型的枚举(值)来与switch-statement一起使用?因为不能打开枚举。
也许返回一个用于序列化/反序列化的简单字节值也是可以使用的,但它有点难看:
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();
}然而,这甚至会引入NPE的可能性,并且实现者必须确保在所有实现中没有字节值是相同的。
发布于 2012-06-26 00:49:00
当我编写枚举时,它们通常构成一个封闭的集合。如果它们必须是动态的,我不会走这条路。我更倾向于从通用接口和多态的角度来思考。
https://stackoverflow.com/questions/11193581
复制相似问题