Joh*_*ane 3 java concurrency design-patterns
以下代码是否对序列化和反射攻击都有抵抗力?
public class Example{
private static Example instance=new Example();
private Example(){}
public static Example getInstance(){
return instance;
}
}
Run Code Online (Sandbox Code Playgroud)
引用约书亚布洛赫,
从版本1.5开始,有第三种方法来实现单例.只需使用一个元素创建一个枚举类型:
// Enum singleton - the preferred approach
public enum Elvis{
INSTANCE;
public void leaveTheBuilding(){...}
}
Run Code Online (Sandbox Code Playgroud)
这种方法在功能上等同于公共字段方法,除了它更简洁,免费提供序列化机制,并提供防止多实例化的铁定保证,即使面对复杂的序列化或反射攻击.
参考.
编辑:
约书亚布洛赫说,如果你想知道原因,
要维护单例保证,您必须声明所有实例字段
transient并提供readResolve方法.否则,每次反序列化序列化实例时,都会创建一个新实例......