Javaでシングルトンを作成する方法は? 初期化の種類、比較、覚えておくべきポイント
公開: 2020-10-07Javaのシングルトンクラスは、オブジェクトが1つだけ、つまりクラスのインスタンスが1つしかないクラスとして定義されます。 インスタンスをクラスごとに1つだけに制限すると、クラスのインスタンスを1つだけ必要とする特定のプログラムをコーディングするのに役立ちます。 シングルトンクラスの唯一のインスタンスには、グローバルアクセスポイントが与えられます。
シングルトンクラスは、Javaプログラミングにおける重要なデザインパターンの1つです。 シングルトンクラスは、リソースの制限と最適化に役立ちます。 データベース接続やソケットでよく使用されます。 シングルトンクラスの実装構文があり、優れた開発者はそれについて知っている必要があります。 Javaでのシングルトンクラスの実装を見てみましょう。
世界のトップ大学からオンラインでソフトウェアエンジニアプログラムを学びましょう。 エグゼクティブPGプログラム、高度な証明書プログラム、または修士プログラムを取得して、キャリアを早急に進めましょう。
読む: Javaアーキテクチャとコンポーネントの説明
目次
初期化
Javaでのシングルトンの初期化は、プライベートコンストラクターを介して行われます。 プライベートコンストラクターは、他のクラスがシングルトンクラスと同じインスタンスを作成できない場合に役立ちます。 Javaでのシングルトンクラスの初期化には、次の5つのタイプがあります。
1.熱心な初期化
一般にgetInstance()という名前のパブリックメソッドが作成されます。 このメソッドは、クラスのインスタンスを作成するためのエントリポイントを1つだけ提供するのに役立ち、したがって、クラスをシングルトンクラスにします。 熱心な初期化のクラスのインスタンスは、クラスのロード時に作成されます。

このタイプの初期化手法は、ユーザーが使用していない場合でも、クラスのインスタンスを自動的に作成します。 これにより、メモリの問題やコードの不要な長さが発生する可能性があります。 メモリリークの問題に対処するために、Javaのシングルトンクラスの別のタイプの初期化手法を見てみましょう。
2.怠惰な初期化
クラスのインスタンスは、レイジー初期化のメソッドgetInstance()自体で初期化されます。 レイジー初期化のメソッドは、クラスのインスタンスが作成されているかどうかをチェックし、作成されていない場合は、インスタンスを作成するだけなので、メモリリークの問題を解決します。
遅延初期化で作成するメソッドは静的であり、戻り型オブジェクトがあります。 レイジー初期化のシングルトンインスタンスは、getInstance()メソッドが初めて呼び出されるまで作成されません。
3.ダブルロック方式による遅延初期化
このメソッドは、複数のスレッドで使用されます。 プログラムで2つのスレッドを使用していて、インスタンスがnullのときに開始するときに、「if」ステートメントを介して両方にアクセスできる場合、競合の状況が発生し、エラーが発生する可能性があります。
この問題は、インスタンスの初期化のために同期ブロックに一度に1つのスレッドのみが入り、他のスレッドがブロックされるダブルロック方式によって解決されます。 最初のスレッドが同期ブロックを出ると、2番目のスレッドだけが別のインスタンスに入り、作成します。 デフォルトでは、2番目のスレッドはインスタンスがnullでないかどうかをチェックしません。
4.レイジーロード方式
ネストされた内部クラスはこのメソッドで作成され、JLS(Java言語仕様)の原則に基づいて機能します。 クラスには静的データメンバーはありません。 JVMはクラスのインスタンスを作成しません。 インスタンスは、getInstance()メソッドを呼び出したときにオンデマンドでのみ作成されます。
このメソッドは、Instance()を取得するすべての呼び出しの自動同期に役立つため、初期化とロードのためにメソッドを同期する必要はありません。

5.列挙型メソッド
シングルトンクラスの複数のインスタンスは、上記のメソッドのシリアル化とリフレクションによって引き続き作成できます。 厳密なシングルトンクラスを作成する場合は、このメソッドを使用できます。 列挙型フィールドは、定数であり、コンパイル時にのみ実行されるこのメソッドで使用されます。
EnumはEnumタイプのインスタンスであり、コード内でEnumタイプが初めて呼び出されたとき/呼び出されたときにのみ構築されます。 このメソッドは、インスタンスのクローン作成を制限し、完全なシングルトンクラスを作成します。
また読む:あなたが今日チェックアウトすべきJavaのトップ12パターンプログラム
シリアル化とリフレクション
シリアル化は、あるJVM(Java仮想マシン)から別のJVMへのJavaオブジェクトの転送に役立ちます。 シリアル化は、クラスの複数のインスタンスを作成するために使用されるメソッドの1つです。 シリアル化により、オブジェクトがバイトストリームに変換され、転送が実行されます。
バイトストリームは、逆シリアル化プロセスを使用して他のJVMでオブジェクトを再作成するのに役立ちます。 複数のシステムがそれらの間でオブジェクトを通信および共有するのに役立ちます。 オブジェクトは異なるJVMで機能するため、JVM間の同期に役立ちます。
リフレクションは、Javaでオブジェクトのクローンを作成する方法でもあります。 リフレクションは、未知のオブジェクトのクラスと、オブジェクトを介してアクセスできるその特定のクラスのメソッドを知るのに役立つAPIです。 リフレクションは、実行時にクラスとメソッドの動作を変更するためにプログラマーによって広く使用されています。
リフレクションで使用される3つの主要なコマンドは、オブジェクトが属するクラスを知るためのgetClass()、オブジェクトのクラスのパブリックコンストラクターを取得するためのgetConstructors()、監視対象のクラスのパブリックメソッドを知るためのgetMethods()です。
通常クラスとシングルトンクラス
Javaの標準クラスはコンストラクターを使用してそれ自体を初期化しますが、getInstance()メソッドを使用してシングルトンクラスを初期化します。 同じクラスとメソッド名を使用することもできます。 最初に通常のクラスのオブジェクトを作成し、次にそのメソッドとプロパティを使用します。
対照的に、シングルトンクラスでは、クラスの静的プロパティを使用してインスタンスを作成し、コード全体の任意の時点で、その特定のクラスは単一のインスタンスのみを返します。
シングルトンクラスの多くの利点に加えて、オブジェクトとメソッドが緊密に結合されている場合、シングルトンクラスがユニットテストメソッドを改ざんするような抜け穴がいくつかあります。 その場合、完全に機能するクラスをシングルトン専用にする必要があります。
シングルトンクラスの参照が他のメソッドに渡され、完全に透過的ではないため、コーダー/開発者がメソッドとクラスを追跡するのが難しいため、非表示の依存関係もシングルトンクラスによって作成されることがあります。 シングルトンパターンを作成する前に、これらの欠点を念頭に置いて、それを最小限に抑えるようにしてください。
完璧なシングルトンクラスを作るためのポイント
1.完全なシングルトンクラスを作成するために焦点を当てるべきポイントは次のとおりです。
2.シングルトンクラスで複数のスレッドを作成する場合は、すべてのスレッドがシングルトンクラスを同時に初期化しないようにしてください。 スレッドセーフなシングルトンクラスを作成するようにしてください。

3.実行時にコンストラクターの可視性を公開するように変更し、特定のシングルトンクラスのインスタンスが1つだけであることを確認して、シングルトンクラスのリフレクションプルーフを作成します。
4.複数のスレッドがある場合は、あるスレッドが他のスレッドの初期化された状態を確認できないようにする揮発性修飾子を使用できます。 揮発性修飾子は、他のスレッドが読み取る前に書き込みがスレッドで発生する、発生前の関係で機能します。
必読:初心者向けの興味深いJavaプロジェクトのアイデア
結論
シングルトンクラスは、データベースまたはクラスのメソッドとインスタンスを制御するプログラムへのカスタマイズされた接続を確立するために使用されます。
Javaスキルを向上させたい場合は、これらのJavaプロジェクトを手に入れる必要があります。 Java、フルスタック開発について詳しく知りたい場合は、upGrad&IIIT-Bのソフトウェア開発のエグゼクティブPGプログラム-フルスタック開発の専門分野をチェックしてください。これは、働く専門家向けに設計されており、500時間以上の厳格なトレーニングを提供します。9 +プロジェクト、および割り当て、IIIT-B卒業生のステータス、実践的な実践的なキャップストーンプロジェクト、およびトップ企業との雇用支援。