4

Java 1.5 (java.lang パッケージ) で定義されているこのクラスから拡張および実装できないという次の問題に遭遇しました。

public abstract class Enum<E extends Enum<E>> {...
}..

私が抱えている問題は、異なる序数値を持つ独自の列挙型を作成することです。getCode() などの序数の別の名前を使用して実装したくないので、上記のクラスを拡張する方法を考えました。

public final class XYZ extends Enum<XYZ> { //Does not work.
  //
  A("A", 1),
  B("B", 7);
  .
}

私は次のことができることを知っています:

public enum NEWEnum {
   A(1),
   B(7);

   private int code;
   private NEWEnum(int code) {
     this.code = code;
   }
   public int getCode() {
     return this.code;
   }
}

代わりに、ordinal() や name() のような通常の名前を Enum に付けたいと思います。

4

5 に答える 5

5

そのように Enum を拡張することはできません。コンパイラまたはランタイムに組み込まれています(どちらかはわかりません)。

しかし、間違った問題を解決しようとしているようです。列挙値の序数は、機能的な意味を持つとは想定されていません。名前を付けるとすぐに、「Ordinal」とは異なる名前になるはずです。2 番目のコード スニペットは、最初のコード スニペットよりもはるかに優れています。

一般に、序数に依存することは悪い習慣です。そもそも公開されるべきではなかったでしょう。信頼できるのは、名前と、自分で割り当てた値だけです。

フィールドに「序数」という名前を付けることが重要な場合は、タイプセーフな列挙型パターン (項目 21)を使用してください。列挙型は単なる実装です。

于 2012-04-10T08:27:56.073 に答える
4

Enum はコンパイラによって特別な扱いを受け、EnumSet のようなクラスはこの扱いに基づいて仮定を行います。ordinal()やのような Enum メソッドの動作name()は厳密に定義されており、この動作を複製するためにそれらを自分で実装しても意味がありません。また、列挙値を宣言する構文は でのみ有効で、 ではenumコンパイルされませんclass

自分自身を決して使用してはならないことを覚えておくことが重要ですordinal()。そのため、問題に合わせて定義することは意味がありません。

于 2012-04-10T08:28:09.960 に答える
1

このEnumクラスは、Enum 言語機能を実装するために使用されるため、Java では特別です。したがって、これは Java の他のクラスのような単なるクラスではなく、より特別な (演算子がオーバーロードStringされている の+ような、またはボックス化されたクラスのような) ものです。これらの機能を動作させるには、列挙型 (連続する序数など) に特別な要件が必要です。したがって、Java 言語仕様では、クラスから手動で継承することを明示的に禁止しています。Enum

于 2012-04-10T08:28:50.703 に答える
0

列挙型は、言語のコアと特別な用途において特別な意味を持ちます。したがって、ステートメントでそれらを使用できますがswitch、これは通常のクラスでは不可能です。

于 2012-04-10T08:29:18.653 に答える