3

次のオブジェクトの初期化をリファクタリングしました。

Req r = new Req();
r.set_f1("A");
r.set_f2(123);
r.set_f3(123.456);

の中へ:

Req r = new Req() {{
    set_f1("A");
    set_f2(123);
    set_f3(123.456)
}};

2 番目のサンプルでは、​​次の Eclipse 警告が発生します。

シリアル化可能なクラスは、long 型の static final serialVersionUID フィールドを宣言していません

これらのコード サンプルは同等であると考えていましたが、違いは何ですか?

4

2 に答える 2

6

2 つ目は匿名サブクラスを作成し、名前のない初期化子で初期化します。が直列化可能である場合Req、そのサブクラスは直列化可能であるため、 を定義する必要がありますserialVersionUID

于 2012-02-19T14:15:06.740 に答える
2

基本クラスが実装する場合、java.io.SerializableサブクラスにはserialVersionUID. 内部クラスはシリアライズ可能であってはなりません。

このコードによって作成されたオブジェクトを、データをシリアル化したい可能性のある他のコードに公開することを計画している場合は、二重中括弧のイディオムを使用しないでください ( で使用できると思いますwriteReplaceが、少し見苦しくなります)。コードがシリアライゼーションに接触しないことが確実な場合は、@SuppressWarnings("serial")可能な限り広いコンテキストに固執してください。

于 2012-02-19T15:02:07.560 に答える