2

Java 5が列挙型の新機能を思いついたときに、なぜ人々が定数だけを格納するためにインターフェースを使用しているのか、私にはまだはっきりしていません。

    interface OlympicMedal {
  static final String GOLD = "Gold";
  static final String SILVER = "Silver";
  static final String BRONZE = "Bronze";
}

そして別のクラスが現在それを実装しています。

public class OlympicAthlete implements OlympicMedal {

  public OlympicAthlete( int aId ){
    //..elided
  }

  //..elided

  public void winEvent( ){
    //the athlete gets a gold medal
    //note the reference is not qualified, as
    //in OlympicMedal.GOLD
    fMedal = GOLD;
  }

  // PRIVATE //
  private String fMedal; //possibly null
} 

上記のように、同じことは列挙型によっても簡単に確立できます。上記のように定数を格納する選択肢があるかどうかを教えてください。列挙型またはインターフェイスを選択する必要があります。

列挙型は次のようになります...

public enum OlympicMedal {  

   GOLD, SILVER, BRONZ  

}  

ただし、クラスがこの定数にアクセスする方法を教えてください。

4

3 に答える 3

4

sを使用するだけenumです。これらは、コードをより型安全にし (例のように「文字列型」ではなく)、一般的な Java イディオムに慣れている開発者がより簡単に読み取り、保守できるようにします。

便利な名前

短い名前が必要な場合は、静的インポートが役立ちます。

import static mypackage.MyEnum.*;

あなたの例では、interface使用コード

package mypackage;

public class OlympicAthlete implements OlympicMedal { ... }

enum OlympicMedal代わりにを使用するように変更されました

package mypackage;
import static mypackage.OlympicMedal.*;

public class OlympicAthlete { ... }

下位互換性

enums を使用して古いクラス ファイルを操作する Java コードが必要な場合は、 -source 1.5and-target 1.4を渡してs を互換性のあるものjavacにコンパイルします。enumこれは、 s が通常の JS クラスのシンタックス シュガーenumにすぎないために機能します。1 つの注意点: 一部のサポート クラス ( 、) は Java <= 1.4 では使用できないため、そのコードを適切に統合するのに役立ちません。EnumMapEnumSet-target

于 2012-08-20T18:09:28.683 に答える
0

列挙型はJava1.5でのみ導入されました。あなたが投稿したコードは1.5より古いものかもしれません

列挙型は型安全性のために最良のオプションです。

于 2012-08-20T18:07:54.517 に答える
0

なぜ人々は定数だけを保存するためにインターフェイスを使用しているのか

おそらく、以前のバージョンの Java からの悪い癖でしょうか? 代わりに
使用enums

public enum OlympicMedal {  

   GOLD, SILVER, BRONZ  

}  

別のクラスからアクセス:

OlympicMedal medal = OlympicMedal.GOLD;

または静的にインポートする場合OlympicMedal

OlympicMedal medal = GOLD;

于 2012-08-20T18:10:28.323 に答える