Java的枚举的自定义字段没有得到连载(Custom fields on java enum not

2019-07-22 03:44发布

我有一个Java枚举,如下图所示:

public enum ExecutionMode {
  TYPE_A,
  TYPE_B,
  TYPE_C;

  private ExecutionMode(){} //no args constr- no really required

  private boolean incremental; //has get/set
  private String someStr;      //has get/set
}

我看到反序列化后,对枚举的自定义字段都将丢失。 阅读更多关于它,我得到的印象是枚举被反序列化成一个字符串,因此它的自定义字段被忽略。

如果它的真实,我是不是滥用枚举这里和应该只使用POJO istead? 或者是有没有办法序列化的自定义字段(不属于构造的一部分)?

谢谢!

Answer 1:

如果值是恒定的,这是更好,你不需要任何序列

public enum ExecutionMode {
  TYPE_A(x,t),
  TYPE_B(y,z),
  TYPE_C(b,s)

  private boolean incremental; //has get/set
  private String someStr;      //has get/set

  ExecutionMode(boolean incremental,String someStr){
        ///... set things appropriately
  } 
}

如果你在运行时设置这些值,我的倾向将是这不应该是摆在首位的枚举 - 应该有,也许包含的值以及一个枚举值参考独立POJO。



Answer 2:

从Java语言规范 :

在枚举最终克隆方法可确保枚举常数可以从不被克隆,并且通过串行化机构的特殊处理可确保重复的实例从不作为反序列化的结果而创建 。 枚举类型的反光实例是禁止的。 总之,这四件事确保不枚举类型的实例存在超出那些由枚举常量定义。

你所要求的将创造的,比方说,TYPE_A多个实例。 这将打破枚举。 枚举应该是一成不变的。



文章来源: Custom fields on java enum not getting serialized