7

以下に示すように、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
}

逆シリアル化の後、列挙型のカスタム フィールドが失われていることがわかります。詳細を読むと、enum が文字列に逆シリアル化されるため、そのカスタム フィールドが無視されるという印象を受けました。

それが本当なら、ここで Enum を悪用しているのでしょうか?代わりに POJO を使用する必要がありますか? または、カスタム フィールド (コンストラクターの一部ではない) をシリアル化する方法はありますか?

ありがとう!

4

2 に答える 2

8

値が定数である場合、これは優れており、何もシリアル化する必要はありません

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 が必要です。

于 2013-03-20T16:48:32.707 に答える
7

Java言語仕様から:

Enum の final clone メソッドは、enum 定数が複製されないことを保証し、シリアライゼーション メカニズムによる特別な処理により、デシリアライゼーションの結果として重複するインスタンスが作成されないことを保証します。列挙型の反射的なインスタンス化は禁止されています。これら 4 つのことにより、enum 定数によって定義されたものを超えて enum 型のインスタンスが存在しないことが保証されます。

あなたが求めているのは、たとえば TYPE_A の複数のインスタンスを作成することです。これにより、列挙型が壊れます。列挙型は不変でなければなりません。

于 2013-03-20T16:50:39.340 に答える