==
上で使用できますenum
か?
はい:列挙型には、インスタンスの==
比較に使用できる厳密なインスタンスコントロールがあります。これは言語仕様によって提供される保証です(私が強調):
列挙型には、その列挙定数で定義されたもの以外のインスタンスはありません。
enum型を明示的にインスタンス化しようとすると、コンパイル時エラーになります。のfinal clone
メソッドEnum
は、enum
定数が複製されないようにし、シリアル化メカニズムによる特別な処理により、逆シリアル化の結果として重複インスタンスが作成されないようにします。列挙型の反射的なインスタンス化は禁止されています。これらの4つの要素enum
により、enum
定数で定義されたインスタンスを超えて型のインスタンスが存在しないことが保証されます。
各enum
定数のインスタンスは1つしかないため、2つのオブジェクト参照を比較するときに、少なくとも1つが定数を参照することがわかっている場合は、メソッドの代わりに演算子を使用できます==
equals
enum
。(のequals
メソッドEnum
は、final
単にsuper.equals
その引数を呼び出して結果を返すため、同一性比較を実行するメソッドです。)
この保証は十分に強力で、Josh Blochが推奨しています。シングルトンパターンの使用を主張する場合、それを実装する最善の方法は、単一要素を使用することですenum
(効果的なJava 2nd Edition、アイテム3:シングルトンプロパティをプライベートコンストラクタまたは列挙型、また、シングルトンで安全スレッド)
違いは何ですか==
とはequals
?
注意として、==
は一般に、の実行可能な代替ではないことを言う必要がありますequals
。ただし(の場合などenum
)は、考慮すべき2つの重要な違いがあります。
==
投げない NullPointerException
enum Color { BLACK, WHITE };
Color nothing = null;
if (nothing == Color.BLACK); // runs fine
if (nothing.equals(Color.BLACK)); // throws NullPointerException
==
コンパイル時に型の互換性チェックが行われます
enum Color { BLACK, WHITE };
enum Chiral { LEFT, RIGHT };
if (Color.BLACK.equals(Chiral.LEFT)); // compiles fine
if (Color.BLACK == Chiral.LEFT); // DOESN'T COMPILE!!! Incompatible types!
すべき ==
該当するに使用するがありますか?
Blochは、インスタンスを適切に制御する不変クラスが、クライアントに==
使用可能であることを保証できることを具体的に述べています。enum
具体的に例示するために言及されています。
項目1:コンストラクターの代わりに静的ファクトリーメソッドを検討する
[...]不変クラスは、2つの等しいインスタンスが存在しないことを保証a.equals(b)
できa==b
ます。クラスがこのことを保証する場合、そのクライアント==
はequals(Object)
メソッドの代わりに演算子を使用でき、パフォーマンスが向上する可能性があります。列挙型はこの保証を提供します。
要約すると、==
on を使用するための引数enum
は次のとおりです。
- できます。
- より速いです。
- 実行時に安全です。
- コンパイル時に安全です。