[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 ID
は1L
を設定するだけ。動くけど。)
親クラスが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で設定する方法を教えれば素直に従うだろう。
個人の趣味でプログラミングしているならともかく、人に「コンパイラを黙らせる方法」として教える人は何を考えているんだろう。
ラベル: Java
0 件のコメント:
コメントを投稿
登録 コメントの投稿 [Atom]
<< ホーム