そこで、もう1つの最も一般的なシングルトンパターン、つまり列挙型シングルトンパターンを記述します。
列挙モードのコードは次のとおりです。
日付はテストの便宜のためです。
public enum EnumInstance { INSTANCE; 非公開オブジェクトの日付。 public Object getDate(){ 返却日; } public void setDate (Object date){ this.date = date; } public static EnumInstance getInstance(){ return INSTANCE; } }
1.次に、テスト用にシリアル化された栗を書くことができます。
public class SerivalTest { public static void main(String [] args)throws IOException、ClassNotFoundException { EnumInstance instance = EnumInstance.getInstance(); instance.setDate(new Object()); // 放文件ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream( "single_file")); outputStream.writeObject(instance); // 取文件File file = new File( "single_file"); ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream(file)); EnumInstance hungrySingleton =(EnumInstance)inputStream.readObject(); System.out.println(instance); System.out.println(hungrySingleton); System.out.println(instance == hungrySingleton); } }
結果は次のとおりです。
いかがですか 列挙は非常に強力ですが、シリアル化と逆シリアル化は列挙をどのように処理しますか?まずinputStream.readObject()を入力し、readEnum()メソッドを見つけます。
次のように:
列挙定数の名前は一意であり、列挙定数に対応するため、列挙定数はタイプと名前で取得されます。したがって、2012行は間違いなく唯一の定数オブジェクトです。
このようにして、新しいオブジェクトは作成されません。このオブジェクトのシングルトン属性は維持されます。この列挙型の処理方法は、依然として非常にシンプルで理解しやすいため、列挙型クラスはシリアル化用です
このダメージは影響を受けません。
2.リフレクション攻撃の例を記述します。
public class Testreflection { public static void main(String [] args)throws NoSuchMethodException、IllegalAccessException、InvocationTargetException、InstantiationException { Class object = EnumInstance.class; コンストラクターコンストラクター= object.getDeclaredConstructor(); constructor.setAccessible(true); EnumInstanceインスタンス= EnumInstance.getInstance(); EnumInstance newInstance =(EnumInstance)constructor.newInstance(); System.out.println(instance.getDate()); System.out.println(newInstance.getDate()); System.out.println(instance.getDate()== newInstance.getDate()); } }
結果を見る:
つまり、パラメーターのないコンストラクターは取得されないため、ソースコードを開いて確認します。java.lang.enumは、以下に示すように、列挙にパラメーターのないコンストラクターがなく、2つのパラメーターを持つコンストラクターが1つしかないことを確認できます。次に、これらの2つのパラメーターを渡して、もう一度テストします。
例外が投げられているのがわかりますが、この例外は反映されてオブジェクトを作成できないことを明確に理解でき、エラーが報告された場所からソースコードを入力して詳細を表示します。
ソースコードは、それが列挙型である場合、例外がスローされ、列挙がどれほど強力であるかを示していることを明確に示しています。