ProgrammingJava上級開発者

Javaのenumはどのように機能し、その使用に関するどのような注意点があり、なぜenumは単なる定数の集合ではないのか?

Hintsage AIアシスタントで面接を突破

回答

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で特定の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の値は常に==で比較されるため、これはシングルトンです。