equals
特定の基準 (基準 A) に基づいて機能を実装した Java Bean オブジェクトがあります。別の基準 (基準 B) に基づいて一意のオブジェクトを識別する必要があります。equals
関数は条件 A を使用するため、使用できませんHashSet
。そこで、基準 B に基づくTreeSet
私のカスタムで使用することを考えました。私の質問は、このようなことをしてもよいですか? Comparator
このアプローチに問題はありますか?
ありがとうございました。
equals
特定の基準 (基準 A) に基づいて機能を実装した Java Bean オブジェクトがあります。別の基準 (基準 B) に基づいて一意のオブジェクトを識別する必要があります。equals
関数は条件 A を使用するため、使用できませんHashSet
。そこで、基準 B に基づくTreeSet
私のカスタムで使用することを考えました。私の質問は、このようなことをしてもよいですか? Comparator
このアプローチに問題はありますか?
ありがとうございました。
Oracle Java のガイドを次に示します。
Set インタフェースを正しく実装するためには、セットによって維持される順序 (明示的なコンパレータが提供されているかどうかにかかわらず) は equals と一致している必要があることに注意してください。(equals との整合性の正確な定義については、Comparable または Comparator を参照してください。) これは、Set インターフェイスが equals 操作に関して定義されているためですが、TreeSet インスタンスはその compareTo (または比較) メソッドを使用してすべての主要な比較を実行するため、この方法で等しいと見なされるキーは、セットの観点からは等しいです。セットの動作は、その順序付けが equals と一致しない場合でも明確に定義されています。Set インターフェースの一般的な契約に従わないだけです。
技術的には、いいえ、問題はないと思います。ただし、コーディング、可読性、保守性に関しては注意が必要です。なぜなら、他の人があなたのしていることを誤用したり誤解したりする可能性があるからです。
検索を頻繁に実行し、要素を追加することはめったにない場合は、List
基準Bで並べ替えて保持し、を使用することを検討してくださいCollections.binarySearch
。
それらをラップできます:
class BeanWrapper {
...
public boolean equals(Object other) {
return myBean.critB.equals(((Bean)other).critB);
}
}
そして、そのようにセットに入れます。