2011-01-20 31 views
14

少し混乱しているので質問があります。@SuppressWarnings( "serial")

public final class ConverterTYPE { 
    private final static HashMap<String, Byte> STRING_MAP = new HashMap<String, Byte>() { 
     { 
      put("A", new Byte((byte)12)); 
      put("B", new Byte((byte)13)); 
     } 
    }; 

} 

我々はすべて知っているように、静的フィールドをシリアル化するつもりはないされていますのは、私はこの1つのように定義された静的フィールドの偉大な数を含むクラスの多くが含まれているいくつかのソースコードを持っているとしましょう。

しかし、Java(およびEclipse)では、「シリアライズ可能なクラスは、long型の静的なfinalVersionUIDフィールドを宣言していません」という文句があります。静的なものがシリアル化されないことに気付かないのはなぜですか?

次の質問:すべての警告を取り除くには@SuppressWarnings("serial")を使用するのがこの問題の正しい解決方法でしょうか?

EDIT:私のクラスの

なしSerializableインタフェース(またはそのスーパークラスのいずれも)を実装していません。そして、EclipseはHashMap<String, Byte>を警告しています。それは静的なフィールドであることをなぜ検出しないのですか?

+2

HashMapはSerializableインターフェイスを実装しています。 HashMapを匿名クラスに拡張するので、その匿名クラスもSerializableを実装します。 – Numeron

+1

オフトピック:https://blog.jooqorg/2014/12/08/dont-be-clearing-the-double-curly-braces-anti-pattern/ –

答えて

20

フィールドがシリアル化されていない可能性があるため、参照するもの自体がシリアル化されることはありません。誰か他のものがそのマップへの参照を取得し、それを直接シリアライズしようとしたり、シリアライズ可能なクラスのインスタンスメンバーなどを使用したりすることができます。私はプライベートですが、現在の外部クラスまたはインスタンスのメンバに設定し(とにかく周りの反射とし、不可能。)コンパイラの範囲を超えて

一つの可能​​な解決策は単純にすべて一緒に初期化子スタイル/ワットという匿名のサブクラスを回避し、これを行うことです。

private final static HashMap<String, Byte> STRING_MAP = new HashMap<String, Byte>(); 

static { 
    STRING_MAP.put("A", new Byte((byte)12)); 
    STRING_MAP.put("B", new Byte((byte)13)); 
} 

ほとんどの場合、結果はほぼ同じであり、コードは匿名クラスでは覆われません。

+1

10回中に9回追加すると、このような静的に初期化されたコレクションは不変であることが意図されています。その場合、Google Collectionsライブラリには素晴らしいImmutableMapクラスがあります: 'ImmutableMap.of(" A "、(byte)12、" B "、(byte)13);'。 「ImmutableMap」もあります。 builder() '、> 5個の要素に必要です。 – yjo

16

しかし、Java(およびEclipse)では、「シリアライズ可能なクラスでは、long型のstatic final serialVersionUIDフィールドが宣言されていません」という文句があります。静的なものがシリアル化されないことに気付かないのはなぜですか?

エラーメッセージと、クラスに最終的な静的メンバー変数があります(少なくとも、あなたの説明をどのように解釈するのか)ということはお互いに関係ありません。

クラスがインターフェイスSerializableを実装している、またはクラスのスーパークラスの1つがそのクラスを実装しています。したがって、コンパイラはクラスがシリアライズ可能であることに気付きます。シリアライズ可能クラスには、クラスのインスタンスをシリアル化するときにバージョン管理に使用されるserialVersionUIDという静的な最終フィールドが必要です。

注釈@SuppressWarnings("serial")を使用すると、不足しているserialVersionUIDについてのコンパイラが終了します。そう、はい、それを使用して警告メッセージを取り除くことができますが、より良い解決策は、クラスがシリアル化されることを意図していない場合は、Serializable(直接的または間接的)を実装しないようにすることです。

+0

私のクラスのどれもSerializableインターフェイスを実装していません(またはスーパークラスはありません)。 – Lukasz

+1

@ルーカスあなたは確かですか?あなたのクラス階層はどのように見えますか? – Jesper

+0

Eclipseがポイントしています:HashMap Lukasz

関連する問題