首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >可扩展枚举

可扩展枚举
EN

Stack Overflow用户
提问于 2012-06-26 00:45:54
回答 1查看 833关注 0票数 0

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

我考虑添加一个接口(可扩展枚举模式),并使用如下所示的方法

public interface IKind和在节点接口中使用类似于public <E extends Enum<E> & IKind> E getKind() {...}的东西。然而,我甚至不确定这是否可以:

代码语言:javascript
复制
@Override
public <T extends Enum<T> & IKind> T getKind() {
  return (T)ENode.ELEMENT_KIND;
}

用于ElementNode (XML)和实现IKind的枚举ENode。此外,它不允许打开节点的类型,这似乎是一个致命的参数,因为一个人可能不想每次都编写一个访问者实现。

当前的实现很简单:

代码语言:javascript
复制
@Override
public ENode getKind() {
  return ENode.ELEMENT_KIND;
}

我目前正在编写一个简单的树形结构的PathSynopsis,因此使用PathNodes,我不想将其添加到核心节点。

顺便说一下:有没有可能返回任何类型的枚举(值)来与switch-statement一起使用?因为不能打开枚举。

也许返回一个用于序列化/反序列化的简单字节值也是可以使用的,但它有点难看:

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

代码语言:javascript
复制
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);
   }

使用

代码语言:javascript
复制
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的可能性,并且实现者必须确保在所有实现中没有字节值是相同的。

EN

回答 1

Stack Overflow用户

发布于 2012-06-26 00:49:00

当我编写枚举时,它们通常构成一个封闭的集合。如果它们必须是动态的,我不会走这条路。我更倾向于从通用接口和多态的角度来思考。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11193581

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档