Java
 Computer >> コンピューター >  >> プログラミング >> Java

Javaで列挙型(enum)を使ってシングルトンを実装する方法


シングルトンパターンとは、あるクラスのインスタンス生成を1つのオブジェクトだけに制限するデザインパターンです。enumでシングルトンを実装する場合、INSTANCEがその役割を担い、これはenumの唯一のインスタンスを表すpublic static finalフィールドです。

EnumSingleton.INSTANCEのように直接アクセスしてインスタンスを取得することも可能ですが、将来的に実装を変更することを見越して、getterメソッドでカプセル化しておくのがより良い設計とされています。

enumをシングルトンとして使うメリット

Javaでenumをシングルトンとして採用する主な理由は以下の3点です。

  • インスタンスの一意性が保証される — リフレクションを使っても複数のインスタンスを生成できない
  • スレッドセーフである — JVMによって初期化が保証されるため、同期処理を自分で書く必要がない
  • シリアライズ対応 — シリアライズ・デシリアライズをしても同じインスタンスが返されることが保証されている

なお、『Effective Java』の著者ジョシュア・ブロックも、シングルトンを実装する最良の手法としてenumの利用を推奨しています。従来のprivateコンストラクタ方式では、リフレクション攻撃やシリアライズ時に複数インスタンスが生まれるリスクがありましたが、enumはこれらの問題を言語仕様レベルで解決してくれる点が大きな強みです。

構文

public enum Singleton {
    INSTANCE;
    private Singleton() {
    }
}

コード例

public enum EnumSingleton {
    INSTANCE;
    private String name;
    private int age;

    private void build(SingletonBuilder builder) {
        this.name = builder.name;
        this.age = builder.age;
    }

    public static EnumSingleton getSingleton() { // 静的なgetter
        return INSTANCE;
    }

    public void print() {
        System.out.println("Name: " + name + ", age: " + age);
    }

    public static class SingletonBuilder {
        private final String name;
        private int age;

        private SingletonBuilder() {
            name = null;
        }

        public SingletonBuilder(String name) {
            this.name = name;
        }

        public SingletonBuilder age(int age) {
            this.age = age;
            return this;
        }

        public void build() {
            EnumSingleton.INSTANCE.build(this);
        }
    }

    public static void main(String[] args) {
        new SingletonBuilder("Adithya").age(25).build();
        EnumSingleton.getSingleton().print();
    }
}

この例では、ビルダーパターンを組み合わせています。SingletonBuilderクラスで名前と年齢を設定し、build()メソッドを呼び出すことで、その値が唯一のインスタンスINSTANCEに反映されます。そして、静的メソッドgetSingleton()を経由してインスタンスを取得することで、内部実装の詳細を隠蔽し、柔軟性の高い設計を実現しています。

出力結果

Name: Adithya, age: 25
  1. QRコードの作り方・読み取り方を徹底解説!初心者向け完全ガイド

    街中や商品パッケージ、チラシなどで目にする機会が多いQRコード。四角い形で、角に小さな正方形が配置され、内部には複雑な模様や点々が描かれています。一見すると何の役に立つのか分かりにくいかもしれませんが、実はとても便利なツールなのです。 QRコードとは? QRコードは「Quick Response(クイックレスポンス)」の略称です。スーパーのレジでバーコードを読み取って価格情報を照会するのと同じように、QRコードもスキャンすることで、あの複雑なデザインの中に隠された情報を取り出すことができます。 バーコードとの大きな違いは、誰でもQRコードを作成できるという点です。企業だけでなく、個人

  2. JavaでJTextFieldに数値のみ入力できるようにする方法

    JTextFieldの入力制限とはデフォルトのJTextFieldは、数値・文字・特殊文字など、あらゆる種類の入力を受け付けることができます。しかし、ユーザーがJTextFieldに入力した内容を検証するのは意外と難しく、特にintなどの数値型へ変換する必要がある場合は注意が必要です。本記事では、JTextFieldに数値のみ入力できるように制限する方法を、具体的なサンプルコードとともに解説します。実装のポイントキー入力を監視するためにKeyListener(KeyAdapter)を使用し、押されたキーの文字が「0」から「9」の範囲内であるかどうかを判定します。数値であれば編集を許可し、それ以