實例證實用枚舉方式實現單例是最佳方式; java
import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; import java.lang.reflect.Constructor; public class Singleton { public static void main(String[] args) throws Exception { Class<?> clazz = Singleton3.class; Constructor[] c = clazz.getDeclaredConstructors(); if(c.length>0) { /**更改默認控制,使私有類型能夠訪問**/ c[0].setAccessible(true); Object obj = c[0].newInstance(null); Object obj2 = Singleton3.INSTANCE; System.out.println(obj == obj2);//false } /**經過序列化和反序列化生成不一樣的對象**/ Singleton2 sing = Singleton2.INSTANCE; seriObj(sing); Class<?> clazz2 = Singleton2.class; Constructor[] c2 = clazz2.getDeclaredConstructors(); if(c2.length > 0) { c2[0].setAccessible(true); //Object obj3 = c2[0].newInstance(null); } Class<?> clazz4 = Singleton4.class; Constructor[] c4 = clazz4.getDeclaredConstructors(); if(c4.length > 0) { c4[0].setAccessible(true); /**運行時異常,提示不能反射建立枚舉類型**/ //Object obj6 = c4[0].newInstance(null); } /**序列化枚舉,反序列化獲得的是同一個對象**/ seriObj(Singleton4.SINGLETON);//true } private static void seriObj (Object obj) throws Exception, IOException { cleanFile("object.txt"); ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("object.txt")); out.writeObject(obj); out.close(); ObjectInputStream in = new ObjectInputStream(new FileInputStream("object.txt")); Object sing2 = in.readObject(); in.close(); System.out.println(obj.getClass().getSimpleName()+":"+(obj == sing2));//false } private static void cleanFile(String path) { File file = new File(path); if(file.exists()) { if(file.isFile()) { /**刪除文件**/ file.delete(); } } } } class Singleton3 { public static final Singleton3 INSTANCE = new Singleton3(); private Singleton3() {} } class Singleton2 implements Serializable{ public static final Singleton2 INSTANCE = new Singleton2(); private Singleton2() { /**能夠經過拋出異常的方式阻止建立對象**/ if(null !=INSTANCE) { throw new RuntimeException("系統不能同時存在多個實例!"); } } } enum Singleton4 { SINGLETON, Singleton4() { } }