ジョシュ・ブロックのアイテム3効果的なJava(プライベート コンストラクターまたは列挙子を使用してシングルトン プロパティを適用する) では、「このアプローチはまだ広く採用されていませんが、単一要素の列挙型はシングルトンを実装する最良の方法です」と述べています。
例:
public enum Elvis {
INSTANCE;
private final String[] favoriteSongs =
{ "Hound Dog", "Heartbreak Hotel" };
public void printFavorites() {
System.out.println(Arrays.toString(favoriteSongs));
}
}
続き: 「このアプローチは、より簡潔で、シリアル化の仕組みを無料で提供し、高度なシリアル化攻撃やリフレクション攻撃に直面しても、複数のインスタンス化に対して強固な保証を提供することを除けば、パブリック フィールド アプローチと機能的に同等です。」
私が見つけた最大の欠点は、列挙型は変更可能な状態を持つべきではないのではないかということです。状態を持つシングルトンを使用するのが一般的なようです。
では、このパターンは出版日(2008 年に第 2 版が出版)以降、実際により一般的になったのでしょうか?
ベストアンサー1
列挙型には通常、変更可能な状態は与えられませんが、これは列挙型がどのように使用されるかという仮定に基づいています。これらの仮定は通常は当てはまりますが、常に当てはまるとは限りません。当てはまらないケースの 1 つが、シングルトンの作成です。
これは列挙型の最も一般的な使用法ではありませんが、変更可能な状態を持つ列挙型を持つことはまったく正当です。ただし、他のプログラマーがそれを見て混乱しないように、コード内でこの事実を示す必要があるかもしれません。
このデザイン パターンの人気については、かなり頻繁に目にしていますが、「一般的」になったと言えるほどではありません。