Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 可扩展枚举_Java_Enums - Fatal编程技术网

Java 可扩展枚举

Java 可扩展枚举,java,enums,Java,Enums,我正在考虑如何编写一种可扩展的节点类方法。当前,树结构中的每个节点都必须实现一个返回节点类型的方法(当前是一个枚举,根据节点类型定义如何序列化和反序列化磁盘上的节点)。如果用户想要使用该框架并定义和实现其他节点类型,我们需要一些可扩展性 我考虑添加一个接口(可扩展的枚举模式)并使用类似于 public interface IKind并在节点接口中使用类似于public E getKind(){…}。但我甚至不确定这是否合适: @Override public <T extends Enum

我正在考虑如何编写一种可扩展的节点类方法。当前,树结构中的每个节点都必须实现一个返回节点类型的方法(当前是一个枚举,根据节点类型定义如何序列化和反序列化磁盘上的节点)。如果用户想要使用该框架并定义和实现其他节点类型,我们需要一些可扩展性

我考虑添加一个接口(可扩展的枚举模式)并使用类似于

public interface IKind
并在节点接口中使用类似于
public E getKind(){…}
。但我甚至不确定这是否合适:

@Override
public <T extends Enum<T> & IKind> T getKind() {
  return (T)ENode.ELEMENT_KIND;
}
我目前正在编写一个树结构的简单PathSymposis,因此使用PathNodes,我不想将其添加到核心节点

顺便问一下:是否有可能返回任何类型的枚举(值)以用于switch语句?。。。因为无法打开枚举

可能还可以使用返回用于序列化/反序列化的简单字节值,但这有点难看:

开关(ENode.getKind(pNewRtx.getNode().getKind())


然而,这甚至会引入NPE的可能性,实现者必须确保实现之间没有相同的字节值。

当我编写枚举时,它们通常构成一个闭合集。如果他们必须充满活力,我就不会走那条路。我更倾向于从一个公共接口和多态性的角度考虑问题。

当我编写枚举时,它们通常构成一个封闭集。如果他们必须充满活力,我就不会走那条路。我更倾向于从通用接口和多态性的角度来考虑。

到目前为止,它们是一个封闭的集合(XML文档的存储),但我认为它作为一个框架对任何类型的持久性修改的树结构文档都更有价值;-)那么,我不会用枚举来做。我并不反对你的想法,只是你选择的实现方式。我认为这与枚举的目的背道而驰。事实上,使用上述方法,你们都是对的。这些方法采用接口的集合。枚举提供了一组默认的接口实现。每个人都赢了。“难道我们就不能和睦相处吗?”到目前为止,它们是一个封闭的集合(XML文档的存储),但我认为它作为一个框架对于任何类型的持久性修改的树结构文档都更有价值;-)那么,我不会用枚举来做。我并不反对你的想法,只是你选择的实现方式。我认为这与枚举的目的背道而驰。事实上,使用上述方法,你们都是对的。这些方法采用接口的集合。枚举提供了一组默认的接口实现。每个人都赢了。“难道我们就不能和睦相处吗?”
@Override
public ENode getKind() {
  return ENode.ELEMENT_KIND;
}
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();
}