きしだのはてな このページをアンテナに追加 RSSフィード

2015-09-01(火) OptionalがSerializableではない話と使い方まとめ

[]OptionalがSerializableではない話と使い方まとめ 16:11 OptionalがSerializableではない話と使い方まとめを含むブックマーク

Optionalは意図的にSerializableではなくなってますね。

でその意図としては、一旦Serializableにして出力形式を決めてしまうと、今後ずっとその出力形式を維持しないといけないことになるので、そのメンテナンスコストを嫌ったというのがあるようです。

このメンテナンスコストの中には、仕様が変えれなくなる、というコストも含みます。

なので、シリアライズしたい場合には、フィールドはnullを持つようにして、getterでOptionalに変換するということになると思います。


基本的にOptionalは、Optional-returnイディオムをサポートするもの以上ではない、ということをBrian goetzさんも書いています。

Shouldn’t Optional be Serializable?


そこで、Optionalの使い方としては、基本的にメソッドの戻り値としてだけ、となりフィールドには使わないほうがいいということになります。

Stephen Colebourneさんは次のように書いてます

  1. Do not declare any instance variable of type Optional.
  2. Use null to indicate optional data within the private scope of a class.
  3. Use Optional for getters that access the optional field.
  4. Do not use Optional in setters or constructors.
  5. Use Optional as a return type for any other business logic methods that have an optional result.

Stephen Colebourne’s blog: Java SE 8 Optional, a pragmatic approach


こんな感じですね。

  1. インスタンスフィールドにOptionalは使わない
  2. プライベートスコープではnullを使う
  3. getterにはOptionalを使う
  4. setterやコンストラクタではOptionalを使わない
  5. メソッドの戻り値にはOptionalを使う

ただ、このとおりにやるとvoid setSome(Some some)/Optional<Some> getSome()となるのでsetter/getterの型が違ってしまいます。このような場合に対応していないフレームワークも多いと思うので、単純ではなさそう。