1,创建一个最简单的单例,同时为了防止反射破坏单例,在被要求创建第二个实例的时候,可以修改构造器,进行异常处理.为了防止反序列化每次都会创建一个新的实例,可以在类中加入readResolve
import java.io.Serializable;
public class Demo implements Serializable {
private static boolean flag = false;
// 防止对象二次创建
private Demo() {
if (!flag) {
flag = true;
} else {
throw new RuntimeException("已经创建对象!");
}
}
private static Demo demo = new Demo();
public static Demo getInstance() {
return demo;
}
// 为了维护并保证单列,所有实例域必须是瞬时的(transient),提供一个readResolve方法,防止反序列化时创建一个新的实例
private Object readResolve() {
return demo;
}
}
测试代码集结果
@Test
public void demo1() throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
Demo instance = Demo.getInstance();
Demo instance1 = Demo.getInstance();
System.out.println(instance);
System.out.println(instance1);
System.out.println(instance.equals(instance1));
Constructor<Demo> declaredConstructor = Demo.class.getDeclaredConstructor();
declaredConstructor.setAccessible(true);
Demo demo = declaredConstructor.newInstance();
Demo demo1 = declaredConstructor.newInstance();
System.out.println(demo);
System.out.println(demo1);
System.out.println(demo.equals(demo1));
}
2,枚举类实现单例更为简单而且绝对防止多次是实例化,代码如下
public enum Demo1 {
INSTANCE;
public void check() {
System.out.println("单元素枚举类实现单例,防止实例化");
}
}
测试代码及结果
@Test
public void demo2() {
Demo1 instance = Demo1.INSTANCE;
instance.check();
}