2016-10-15 11 views
0

私は教育目的でJavaバリューオブジェクトを調査しています。Javaバリューオブジェクト定義

私が理解していないのは、(同じ呼吸で)JavaバリューオブジェクトにComparableが実装されていることを誰も言及していない理由です。

Javaバリューオブジェクトに「正しい」HashCodeが必要な場合&同等の理由から、Comparable CompareToメソッドを使用する必要はありません。

ここに私の思考プロセスがあります。バリューオブジェクトのインスタンスは等価であるかどうかのテストが行​​われるため、正しいequals/hashcodeが必要です。 値オブジェクトは "ハッシュ"コレクションに格納することができ、再びHashcodeメソッドが必要です。 Comparableで追加しないと、オーダーされたコレクションのキーになることがありますか?

+0

なぜcompareToメソッドを実装する必要があるのですか? –

+0

現在使用している値オブジェクトの定義の参照はありますか?しかし、あなたの質問はほとんど読まれています:「なぜこのコンセプトを定義した人々はこの他のコンセプトを含んでいませんでしたか?」そして、これらの質問は原作者に直接質問することができなければ答えが不可能ではないにしても難しくあります。 –

答えて

4

主な理由は、指定する任意の値オブジェクトに対して、インスタンスの順序を決める複数の方法があるのに対し、等価の定義は実際には1つだけです。等価性のユニークな定義では、equals()をオーバーライドする必要があります(デフォルトでは不十分な場合)。これを行うと、ドキュメントに引用されているすべての理由で一致するhashCode()の実装を提供する必要があります。

しかし、値オブジェクトクラスのインスタンスを注文するのにComparableを実装する必要はありません。実際には複数の方法で注文することはできません。匿名のインラインComparatorの実装をソートメソッドに渡すだけで、さまざまな順序の異なるコンパレータ実装で十分です。これは、Java 8とlambda以来ずっと簡単です。近年では私自身がこのような理由でComparableを実装することを躊躇しています。

もちろん、特定の値のオブジェクトクラスに自然な順序がある場合、是非ともComparableを実装してください。その場合は、あなたのequals()の実装と一貫していることを確認してください。

関連する問題