这个Singleton对序列化和反射攻击都有抵抗力吗?

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)

mre*_*mre 8

引用约书亚布洛赫,

从版本1.5开始,有第三种方法来实现单例.只需使用一个元素创建一个枚举类型:

 // Enum singleton - the preferred approach
 public enum Elvis{
     INSTANCE;

     public void leaveTheBuilding(){...} 
 }
Run Code Online (Sandbox Code Playgroud)

这种方法在功能上等同于公共字段方法,除了它更简洁,免费提供序列化机制,并提供防止多实例化的铁定保证,即使面对复杂的序列化或反射攻击.

参考.

编辑:

约书亚布洛赫说,如果你想知道原因,

要维护单例保证,您必须声明所有实例字段 transient并提供 readResolve方法.否则,每次反序列化序列化实例时,都会创建一个新实例......

  • 布洛赫正在编造一些废话以出售他的"发明".单身人士是沉重的物体,没有人会将它们序列化.如果有人真的想要序列化单例,则必须保存单例的快照状态,并在反序列化时恢复.Enum不这样做.对单例使用枚举只是滥用其功能.在许多原因中,枚举应该是简单的不可变对象; 单身人士大多是可变的. (2认同)