2006/10/29

[Java]eclipse warn serialVersionUID isn't declare

Eclipseで開発しているとき、SerializableをimplementsしているのにserialVersionUIDを宣言していないと警告が表示されるようになった。
The serializable class Foo does not declare a static final serialVersionUID field of type long
#日本語版のメッセージは確認してない

この警告は、javacで-Xlintオプションを付けると出力されるものだ。 この警告に対処するには、言われたとおりserialVersionUIDを宣言しよう。JDKについているserialverコマンドを使うのが一番オーソドックスな対応法だ。

E:\hoge>serialver -classpath . Serial Serial: static final long serialVersionUID = -563646877436713083L;

出力されたSerial:より後ろを、ソースに貼り付ければ完了。
Eclpseを使っているのなら、Ctrl+1の後でadd generated serial version IDを選択すると、もっと簡単に宣言できる。(add default serial version ID1Lを設定するだけ。動くけど。)
親クラスがSerializeを実装しているけど、自前クラスはシリアライズできないように対処しているのなら、アノテーション@SuppressWarning("serial")でコンパイラの警告を出さないようにできる。(アノテーションは5.0以降だけ)

Eclipseで既存のソースを眺めているだけだったりするなら、コンパイラ設定の警告/エラーから無視するように設定することができる。これは、メニューのWindowからワークスペースのデフォルトとしても設定できるし、プロジェクトごとに個別に設定することもできる。

serialize関連のメモを書いて気づいたんだけど。Googleで検索して出てくる警告への対処方法に、すごいものがぞろぞろ…

  • 1Lを設定してください
  • Eclipseの設定を変えるといい
  • SuppressWarningを書いてください

おいおい、せっかく警告してくれてるのに、黙らせちゃうのかよ…。どこでインスタンスを参照されているか分かったもんじゃないのに。
1Lを宣言するのは意味が分からない。Eclipseで始めてこのメッセージを見たのなら、どうせEclipseを使ってるんだろう。同じ手間をかけるなら、Ctrl+1からちゃんとした値を生成した方が良いじゃないか。 SuppressWarningのアノテーションは、「ちゃんと別の方法で対処してるよ」とコンパイラに知らせるための手段であって、コンパイラを黙らせるための方法じゃない。根本的な対策をとって(この場合、writeObject()でException投げるなりしてシリアライズできないようにして)始めて使っていい方法だ。
Eclipseの設定に到っては、設定の箇所に「潜在的な問題」とまで書いてある。要するに「動いちゃいるけどバグだ」ってことだ。この辺の設定やserialVersionUIDを知らないのは、基本的に初心者だろう。何の注意書きもなく教えていい設定じゃない。さらに言えば、javacで-Xlintを使ってコンパイルしたら出力されるんだから解決になっていない。

初心者なら、serialVersionUIDが何者かを理解できなくても、serialverやCtrl+1で設定する方法を教えれば素直に従うだろう。
個人の趣味でプログラミングしているならともかく、人に「コンパイラを黙らせる方法」として教える人は何を考えているんだろう。

ラベル:

0 件のコメント:

コメントを投稿

登録 コメントの投稿 [Atom]

<< ホーム