不変オブジェクトのインターフェイスを宣言しないでください
[編集] 問題のオブジェクトがデータ転送オブジェクト(DTO)またはプレーンオールドデータ(POD)を表す場合
それは合理的なガイドラインですか?
これまで、不変の(データを変更できない)シールクラスのインターフェイスを作成することがよくありました。私は、不変性を気にするところにはインターフェースを使用しないように注意しました。
残念ながら、インターフェイスはコードに浸透し始めます(心配しているのは私のコードだけではありません)。インターフェースを渡された後、渡されるものが不変であると本当に想定したいコードにそれを渡したいと思うでしょう。
この問題のため、不変オブジェクトのインターフェイスを宣言しないことを検討しています。
これは単体テストに関して悪影響があるかもしれませんが、それ以外に、これは合理的なガイドラインに思えますか?
または、私が見ている「拡散インターフェース」の問題を回避するために使用すべき別のパターンがありますか?
(私はこれらの不変オブジェクトをいくつかの理由で使用しています:主にスレッドセーフのために、私は多くのマルチスレッドコードを書いていますが、それはまた、メソッドに渡されるオブジェクトの防御的なコピーの作成を避けることができるためです。コードは何かが不変であることを知っている多くの場合-インターフェイスを渡された場合はそうではありません。実際、インターフェイスを介して参照されるオブジェクトの防御コピーを作成することさえできません。クローン操作またはそれをシリアル化する方法...)
[編集]
オブジェクトを不変にしたいという私の理由により多くのコンテキストを提供するには、Eric Lippertの次のブログ投稿を参照してください。
http://blogs.msdn.com/b/ericlippert/archive/tags/immutability/
また、ここでは、マルチスレッドジョブキューで操作/受け渡しされるアイテムなど、いくつかの低レベルの概念で作業していることを指摘する必要があります。これらは本質的にDTOです。
また、Joshua Bloch は、著書Effective Javaで不変オブジェクトの使用を推奨しています。
ファローアップ
フィードバックをありがとう、すべて。先に進み、このガイドラインをDTOとその同類に使用することにしました。これまでのところ順調に機能していますが、1週間しか経っていません...それでも、見栄えは良いです。
これに関連する他の問題がいくつかあります。特に私が「ディープまたはシャロー不変性」と呼んでいるもの(ディープアンドシャロークローンから盗んだ命名法)-しかし、それはまた別の質問です。
List<Number>
保持できるInteger
、Float
、Long
、BigDecimal
、等...すべてが自分自身不変です。