Javaのenumは、java.lang.Enumを継承するクラス型であり、制限された定数オブジェクトのセットを表しますが、名前のセットにとどまりません。enumはメソッド、フィールド、コンストラクターを拡張し、インターフェイスを実装して動作を追加できます。
例:
enum Day { MONDAY("平日"), SATURDAY("休日"); private String description; Day(String description) { this.description = description; } public String getDescription() { return description; } } Day d = Day.SATURDAY; System.out.println(d.getDescription()); // "休日"
注意点:
質問: 「enumで特定のenum値に対してメソッドをオーバーライドできますか? できる場合は、どのように?」
よくある間違い: すべての値の動作が常に同じであると誤解されています。
正しい回答: はい、特定の定数に対する特異な実装が可能です。
例:
enum Operation { PLUS { double apply(double x, double y) { return x + y; } }, MINUS { double apply(double x, double y) { return x - y; } }; abstract double apply(double x, double y); }
歴史
自動車運転者の管理システムではenumでステータスを保持しており、APIコード用の追加フィールドを実装せず、開発者はenumを継承しようとしましたが、これは禁止されていました。その結果、ステータスの保存モデルを再構築する必要がありました。
歴史
オンラインストアで、プログラマーはテスト用に偽のインスタンスを作成するためにリフレクションユーティリティを使ってプライベートコンストラクターを「解凍」しましたが、新しいインスタンスを作成することはできず、例外が発生しました。CIは通過せず、テストは失敗しました。
歴史
ある古いプロジェクトで、enumの値をequals()で比較しましたが、==で比較すべきでした。デシリアライズ中に問題が発生し、enumの値は常に==で比較されるため、これはシングルトンです。