1. ホーム
  2. java

[解決済み] SuppressWarnings("シリアル")

2022-02-04 03:35:08

質問

少し混乱してきたので(あるいは、明らかなことに気づいていないのかもしれませんが)質問があります。例えば、以下のような静的フィールドを大量に含むソースコードがあるとします。

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));
        }
    };

}

ご存知のように、静的フィールドはシリアライズされません。

しかし、Java(とEclipse)は、"The serializable class does not declare a static final serialVersionUID field of type long"と文句を言っています。なぜ、staticがシリアライズされないことに気がつかないのでしょうか?

そして、次の質問ですが、この問題に対する正しい解決策は @SuppressWarnings("serial") このような警告をすべて取り除くには?

EDITです。

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

解決方法は?

そのフィールドがシリアライズされないかもしれないからといって、それが参照するもの自体がシリアライズされることはないのです プライベートであることはわかりますが、現在のクラスの外からアクセスされたり、インスタンスメンバに設定されることがないようにすることは、コンパイラの範囲を超えています(そして、いずれにせよリフレクションでは不可能です)。

1つの可能な解決策は、単に匿名サブクラスとイニシャライザのスタイルをすべて回避し、これを実行することです。

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));
}

ほとんどの場合、結果はほぼ同じで、コードに無名クラスが散見されることもありません。