方案一:私有化构造器,通过static final域
@Test public void test13() { A215 a=A215.a; A215 b=A215.a; System.out.println(a==b);//true } class A215{ public static final A215 a=new A215(); private A215(){} }
方案二:私有化构造器,私有化static final域通过工厂模式来实现
@Test public void test20() { A211 a1=A211.getA211(); A211 a2=A211.getA211(); System.out.println(a1==a2);//true } class A211{ private static final A211 a=new A211(); public static A211 getA211(){ return a; } }
方案三,通过Enum来实现
@Test public void test12() { A216 a217 = A216.A217; A216 a218 = A216.A217; System.out.println(a217==a218);//true } } enum A216{ A217; private A217 a=null; private A216(){ a=new A217(); a.name="wangyang"; } public A217 getA217(){ return a; } } class A217{ public String name; public void hello(){ System.out.println("hello "+name); } }
其实对于第一种,和第二种方法。通过反射或者序列化可以打破其单例的实现,但第三种无偿地提供了序列化机制,绝对防止多次实例化,即使是在面对复杂的序列化或者反射攻击的时候
原文:http://www.cnblogs.com/wangyang108/p/5830315.html