0

拡張可能なノードの種類のアプローチを作成する方法を考えています。現在、ツリー構造の各ノードは、ノードの種類を返すメソッドを実装する必要があります (現在、ノードの種類に応じてディスク上のノードをシリアル化および逆シリアル化する方法を定義する列挙型)。ユーザーがフレームワークを使用し、他のノード タイプを定義および実装したい場合は、ある程度の拡張性が必要です。

インターフェイス(拡張可能な列挙型パターン)を追加して、次のようなものを使用することを考えました

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 を実装する enum ENode 用。さらに、毎回ビジター実装を書きたくないので、どういうわけか致命的な引数のように見える種類のノードをオンにすることはできません。

現在の実装は次のとおりです。

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

現在、ツリー構造の単純な PathSynopsis を作成しているため、コア ノードに追加したくない PathNodes を使用しています。

ところで:switch-statementで使用するために何らかの種類の列挙型(値)を返すことはどういうわけか可能ですか?... Enumをオンに切り替えることはできません。

おそらく、シリアライゼーション/デシリアライゼーションに使用される単純なバイト値を返すことも使用できますが、少し醜いです:

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 の可能性をもたらすことにもなり、実装者は実装全体でバイト値が同一にならないようにする必要があります。

4

1 に答える 1

4

私が列挙型を書くとき、それらは通常閉集合を構成します。それらが動的でなければならない場合、私はそのルートには行きません。共通のインターフェースとポリモーフィズムの観点から考える可能性が高いでしょう。

于 2012-06-25T16:48:59.933 に答える