シングルトン(シングルトン)属性またはプライベートコンストラクタ列挙型を強化

シングルトン(シングルトン)は、一度だけインスタンス化されるクラスです。それはそのタイプとしてインタフェースを実装しない限り、アナログの代わりに、この単一のケースでは達成することは不可能であるため、クラスはシングルトンは、テストすることが困難になることができます。以下のシングルトンを実装するには、いくつかの方法があります。

1、静的メンバーの合計が最終

公共の最後のフィールドを持つ//シングルトン
パブリッククラスエルビス{ パブリック静的最終エルビスINSTANCE =新しいエルビス()。
    プライベートエルビス(){...} 
}
    

エルビスは一旦インスタンス化に起因公共(パブリック)または保護された(保護)コンストラクタの欠如のために、インスタンスElvis.INSTANCEプライベートコンストラクタ特性後、一回のみエルビス例(注提示する:反射)必要性は、このような攻撃に抵抗する場合は、2番目のインスタンスは、例外は、オブジェクトの最初のインスタンスに直接戻って投げ、またはされている場合、あなたはそれが作成され、プライベートコンストラクタを変更することができ、プライベートコンストラクタに複数の呼び出しを達成することができます。

図2は、公衆のメンバーは静的メソッドです。

staticファクトリと//シングルトン
パブリッククラスエルビス{ プライベート静的最終エルビスINSTANCE =新しいエルビス(); 
    プライベートエルビス(){...} 
    パブリック静的エルビスのgetInstance(){インスタンスを返します。} 
}
    

 この実施形態は、非単一の実施形態のクラスにパブリック静的メソッドすることができますが、ユーザーがコードを変更する必要はありません。

シングルトンは、それが(直列化)シリアライズされたメソッドに実装請求このタイプを使用するためには、単に追加することは、「直列化実装」の宣言には不十分です。シングルトンを維持し、確保するために、すべてのインスタンスが一時的(一過性)あり宣言し、メソッドはreadResolve、ではない、すべての時間がシリアル化インスタンスをデシリアライズ人々を提供しなければならない、で、例えば、の新しいインスタンスを作成します今回の例では、「偽エルビス」につながります。これを防ぐために、以下は、このクラスエルビスreadResolveメソッドに追加されました。

参考住所:https://blog.csdn.net/zhushuai1221/article/details/51780895

// 直列化復元を防止するための1は、複数のオブジェクトの脆弱性を取得します。  
// オブジェクトがI / Oストリームから読み出されるときに2、両方は、シリアライズまたは外部化インタフェースを実装する、はreadResolve()メソッドをするために呼び出されます。
// 3は、実際にはreadResolve()デシリアライゼーション・プロセスで作成されたオブジェクトのための直接交換のオブジェクトを返すを使用することです。
プライベートオブジェクトはreadResolve(){
       戻りインスタンス;    
}

 図3は、単一の列挙形態(ベストモード)を使用して実装しました

/ ** 
 *列挙シングルトン
 * 
 * / 
パブリック クラスエルビス{
     プライベートエルビス(){}
パブリック 静的エルビスのgetInstance(){ 戻り(Singleton.INSTANCE.getInstanceを); } プライベート 列挙シングルトン{ INSTANCE; プライベートエルビスシングルトン; // JVMは、一度だけ、このメソッドが呼び出されることを保証する絶対ます シングルトン(){ シングルトン = 新しい新;エルビス() } 公共{エルビスのgetInstance()が 返す、シングルトンを } } }

この方法は、単一の要素を含む調製物、それを必要とする列挙型に基づいています。無料は絶対にしても、洗練された直列化または反射攻撃時の顔に、複数の直列化を防止するため、直列化メカニズムを提供します。

 

 

  

おすすめ

転載: www.cnblogs.com/cq-yangzhou/p/10072367.html