0

以下の 2 つの Java での enum の定義の違いは何ですか? また、最初の定義が 2 番目の定義よりも優れている点は何ですか?

public enum Suit {//first definition
   CLUBS (1), SPADES (2), HEARTS (3), DIAMONDS (4);
   int value;
   private Suit(int v) { value = v; }
};

public enum Suit {//second definition
   CLUBS, SPADES, HEARTS, DIAMONDS;
};
4

5 に答える 5

2

この例では、明らかな「int 値」以外に違いはありません。

一般に、Java 5+ の enum はいくつかの制限のあるクラスです。通常のクラスのように、'new' を使用して enum のインスタンスを自分で作成することはできません。

一方、列挙型は、通常のクラスやメソッドと同じようにデータ フィールドを持つことができます。

列挙型がたとえば惑星を表し、列挙型の各インスタンスに惑星の半径などの非常に有用なデータが含まれているとしたらどうでしょうか? この場合、次のようにコーディングします。

public enum Planet {

    EARTH(6000), VENUS(5000);
    int radius;
    private Planet(int radius) {this.radius = radius;}

     // now define a getter:

     public int getRadius() {

         return radius;
     } 
}

ここでゲッターに注意してください。列挙型インスタンスからこの種のデータに直接アクセスできるようになります。

例えば:

public void somewhereInYourCode(...) {

   .....
    Planet p = getPlanet(); // get the planet from your system 

    int radius = p.getRadius();
   ....
}

お役に立てれば

于 2012-10-11T11:21:44.063 に答える
1

フィールドが必要な場合は最初のフィールドを使用し、フィールドが必要ない場合は 2 番目のフィールドを使用します。

要件に合った適切なコードを選択することです。

于 2012-10-11T11:21:34.953 に答える
1

あまり違いはありません。最初のものは読みやすく、値を設定するための組み込み関数があります。それは、あなたがコードを書くのを好む方法です。それは次のようなものを比較するようなものです

if (outOfBounds){
doSomething();}

if(outOfBounds == true){ doSomething();}

于 2012-10-11T11:22:25.910 に答える
1

Suiteプライベートコンストラクターで使用 Suite.CLUBS.valueする場合は、標準を使用する場合は使用するenum必要がありますSuite.CLUBS.ordinal()

に他のプロパティを追加すると、 のプライベート コンストラクターの使用enumがより興味深いものになりますSuite

于 2012-10-11T11:23:38.760 に答える
0

int を使用して列挙型の値を参照する場合は、列挙型値のインデックス番号に依存するのではなく、最初のバリアントを使用する方がよい場合があります。

このようにして、まずどの int 値がどの enum 値に属しているかがより明確になり、順序を変更しても壊れません。

于 2012-10-11T11:22:42.190 に答える