Java における value objects
   1 min read

Java 標準 API のドキュメントには、 "値ベース・クラス" というページがあります:

機械翻訳っぽくて分かりづらい箇所もあるので、併せて Java8 版英語版 も見てみると良いかもです。

現在の Java [1] における value objects は、この値ベース・クラスの要件に沿ったクラスをインスタンス化したもの、と考えて良さそうに思いました。次の点が注目ポイントでしょうか:

  • インスタンスフィールドは final

  • ==, != を用いて比較してはいけない。 インスタンスフィールドの値で比較する(equals() をそのように実装して、それを用いる)。

前回触れた、 Wikipedia の Java の項に書かれていることですね。

ちなみに、 Java16 以降では、JDK の中の値ベース・クラスに相当するクラスには jdk.internal.ValueBased アノテーションが付与されているようです(このアノテーションの目的は JEP390 にあります。 Project Valhalla の準備として、不適切に利用されている箇所でコンパイル時に警告するためのようです)。


1. Project Valhalla 導入後はまた話が変わるはずです。