Javaのシングルトンクラス–シングルトンクラスの使い方は?



Javaのシングルトンクラスに関するこの記事では、クラスをシングルトンにするさまざまな方法と、実際の実装について説明します。

Javaでは、シングルトンクラスは、一度に1つのインスタンスしか持つことができないクラスです。これは、Javaの5つの創造的デザインパターンの1つであり、 。この記事の媒体を通して、Javaのシングルトンクラスとは何か、そしてそれを作成する方法について明確な洞察を提供します。

以下は、この記事で取り上げるトピックです。





始めましょう。

Javaスキャナーは次の文字を取得します

Javaのシングルトンクラスとは何ですか?

簡単に言えば、Javaのシングルトンクラスは、一度に1つのインスタンスを介してアクセスできるようにするクラスです。このデザインパターンは、クラスの不要なインスタンス化を制限し、1つだけを確保するためのものです。 JVMインスタンスごとに任意の時点で存在します。したがって、このパターンでは、シングルトンとして定義されているクラスにはインスタンスが1つしかありません。それへのグローバルなアクセスポイントを持ちます。通常のクラスとは異なり、シングルトンクラスはアプリケーションのライフサイクルの終わりまでに破壊されません。



しかし、そもそもなぜシングルトンクラスが必要なのですか?

クラスのインスタンス作成を制限することで、新しいリクエストが行われるたびにオブジェクトが作成されないため、メモリスペースを節約できます。代わりに、単一のオブジェクトが繰り返し使用されます。これが、Javaのシングルトンパターンが主に使用される理由です。 およびデータベースアプリケーション。基本的に、ロギング、キャッシング、スレッドプーリング、構成設定などに使用されます。。

Javaのシングルトンクラスの概念を明確に理解していただければ幸いです。それでは、これをさらに進めましょうJavaのシングルトンクラスの記事で、それらがどのように作成されるかを確認してください。



Javaシングルトンクラスを設計する方法

Javaでクラスをシングルトンにするには、次の3つが必要です。

  1. クラスの静的メンバー
  2. プライベートコンストラクタ
  3. 静的ファクトリメソッド

Javaは開発者に彼らの視野を探求させるので、シングルトンクラスを設計するためのいくつかの方法。以下に最も人気のあるものをリストアップしました。

  1. 熱心な初期化方法
  2. レイジー初期化メソッド
  3. スレッドセーフシングルトン方式
  4. ダブルロック方式による遅延初期化
  5. レイジーロード方式
  6. 静的ブロック初期化方法

それでは、これらのアプローチを1つずつ詳しく見ていきましょう。

1.熱心な初期化方法

これは、クラスのロード時にインスタンスが作成されるシングルトンクラスを作成する最も簡単な方法です。このメソッドを使用してシングルトンクラスを作成するには、以下の手順に従う必要があります。

  1. コンストラクターをプライベートとして宣言します。
  2. 次のステップは、このシングルトンクラスのプライベートクラスメンバーを作成することです。
  3. 次に、クラスメンバーのインスタンスとして作成した、クラスのオブジェクトを返すために使用されるファクトリメソッドを定義する必要があります。
  4. この静的インスタンスに直接アクセスする場合は、静的メンバーをパブリックとして宣言することもできます。

それでは、これらを実装する方法を見てみましょう。

// Eager初期化publicclass EagerSingleton {private static final EagerSingleton INSTANCE = new EagerSingleton()private EagerSingleton(){} public static EagerSingleton getInstance(){return INSTANCE}}

コードを見ると、オブジェクトをインスタンス化するたびに、を利用していることがわかります。getInstance()クラスを呼び出すのではなくメソッド ビルダーしかし、それ自体に欠点があります。このメソッドを使用してクラスをシングルトンにすると、アプリケーションがそれを使用しているかどうかに関係なく、インスタンスが作成されます。

それでは、先に進んで、Javaでシングルトンクラスを作成する別の方法を見てみましょう。

2.レイジー初期化メソッド

このメソッドは、クラスインスタンスの作成を最初に使用するまで延期するため、レイジー初期化と呼ばれます。つまり、このメソッドでは、オブジェクトは必要な場合にのみ作成されます。不必要な作成を回避するのに役立ちます 。この方法でシングルトンクラスを設計するには、以下の手順に従う必要があります。

  1. まず、コンストラクターをプライベートとして宣言します。
  2. 次に、このクラスのプライベート静的インスタンスを作成する必要がありますが、まだインスタンス化する必要はありません。
  3. 最後に、インスタンスメンバーがnullかどうかを最初にチェックするファクトリメソッドを作成します。そうでない場合は、シングルトンクラスのインスタンスを作成して返します。

以下のコードは、これを実行する方法を示しています。

//レイジー初期化publicclass LazySingleton {private static LazySingleton INSTANCE = null private LazySingleton(){} public static LazySingleton getInstance(){if(INSTANCE == null){synchronized(LazySingleton.class){INSTANCE = new LazySingleton()}}インスタンスを返す}}

3.スレッドセーフシングルトン 方法

しかし、上記のアプローチは、同時シナリオでいくつかの懸念を引き起こす可能性があります。シングルトンパターンは主にマルチスレッドで使用されるため、複数のスレッドが同時にif条件に入ると、問題が発生する可能性があります。これを回避するために、グローバルアクセスメソッドを同期させることにより、スレッドセーフなシングルトンクラスを作成しようとします。これにより、任意の時点で1つのスレッドのみがこのメソッドを実行していることが保証されます。実装を確認するには、以下のコードを参照してください。

//スレッドセーフシングルトンパブリッククラスThreadSafeSingleton {プライベート静的ThreadSafeSingletonINSTANCEプライベートThreadSafeSingleton(){}パブリック静的同期ThreadSafeSingleton getInstance(){if(INSTANCE == null){INSTANCE = new ThreadSafeSingleton()} return INSTANCE}}

しかし、このアプローチは、メソッドが毎回非常に面倒になることがありますが呼び出されると、メソッドがロックを使用できるようになる前に、ロックが解放されるのを待つ必要があります。これにより、プロセスが遅くなり、次のアプローチに進むことができます。ダブルロックによる遅延初期化。

4.ダブルロックによる遅延初期化 方法

このアプローチでは、メソッドを同期しません。むしろ、同期されたブロック内にオブジェクト作成コードを包み込みます。事前にスレッドロックを確認することで、ロック取得の数を減らします。このアプローチにより、通常、アプリケーションのパフォーマンスが向上します。以下のコードをチェックして、それがどのように行われるかを確認してください。

//ダブルロックによるレイジー初期化publicclass LazyDoubleLockSingleton {private static LazyDoubleLockSingleton INSTANCE = null private LazyDoubleLockSingleton(){} public static LazyDoubleLockSingleton getInstance(){if(INSTANCE == null){synchronized(LazyDoubleLockSingleton.class){if(INSTANCE == null){INSTANCE = new LazyDoubleLockSingleton()}}} return INSTANCE}}

5.レイジーロード方式

このメソッドは、JSL(Java言語仕様)に基づいており、これに準拠しています 静的データメンバーは、必要な場合にのみロードされます。したがって、シングルトンクラスがJVMにロードされると、インスタンスは作成されません。さらに、プログラムの実行中に、グローバルメソッドが順番に呼び出されます。このメソッドを使用すると、静的getInstance()を明示的に同期してロードおよび初期化する必要はありません。静的クラスメンバーは適切な順序で呼び出され、グローバルメソッドの残りの同時呼び出しは、同期オーバーヘッドを実行することなく同じ順序で返されます。

以下は同じことを実行するためのコードです。

//レイジーロードメソッドpublicclass LazyLoadSingleton {private LazyLoadSingleton(){} private static class SingletonClassHolder {static final Var INSTANCE = new LazyLoadSingleton()} public static LazyLoadSingleton getInstance(){return SingletonClassHolder.INSTANCE}}

6.静的ブロック初期化方法

Javaでシングルトンクラスを作成するこのメソッドは熱心な初期化方法に似ています。唯一の違いは、このクラスのインスタンスが静的ブロック内に作成されることです。 機能。

//静的ブロックの初期化publicclass StaticBlockSingleton {private static StaticBlockSingleton INSTANCE private StaticBlockSingleton(){} //静的ブロック内の例外処理static {try {INSTANCE = new StaticBlockSingleton()} catch(Exception e){throw new RuntimeException( 'Exceptionoccurred。シングルトンクラスの作成中 ')}} public static StaticBlockSingleton getInstance(){return INSTANCE}}

これで、Javaのシングルトンクラスに関するこの記事は終わりです。 Javaについて詳しく知りたい場合は、 。

Javaのシングルトンクラスとは何かを理解したので、 25万人以上の満足した学習者のネットワークを持つ信頼できるオンライン学習会社であるEdurekaが世界中に広がっています。 EdurekaのJavaJ2EEおよびSOAトレーニングおよび認定コースは、Java開発者になりたい学生および専門家向けに設計されています。このコースは、Javaプログラミングをすぐに開始できるように設計されており、HibernateやSpringなどのさまざまなJavaフレームワークに加えて、コアと高度なJavaの両方の概念についてトレーニングします。

質問がありますか?この「Javaのシングルトンクラス」の記事のコメントセクションでそれについて言及してください。できるだけ早くご連絡いたします。