この質問への答えはおそらく「不可能」ですが、とにかく質問させてください:)
たとえば、主キーを持つ非常に単純な JAVA クラスがあるとします。
class Person {
String ssid;
String name;
String address;
...
}
ここで、人をコレクションに保存したいと考えています。つまり、equals メソッドをオーバーライドする必要があります。完全に些細な問題ではありませんが、基本的には次のようなものがあります。
@Override
public boolean equals (Object other) {
if(other==this) return true;
if(!other.getClass().equals(this.getClass()) return false;
Person otherPerson = (Person)other;
if(this.ssid.equals(otherPerson.getSsid()) return true;
}
頭からこれを入力するだけで、明らかな失敗を許してください。さて、後でアプリケーションで、ユーザー入力を通じて取得した ssid があるとしましょう。ssid を Person と比較したい場合は、次のように呼び出す必要があります。
String mySsid = getFromSomewhere();
Person myPerson = getFromSomewhere();
if(myPerson.equals(new Person(mySsid)) doSomething();
これは、ssid に基づいて Person を作成するための便利なコンストラクターを作成する必要があることを意味し (まだ作成していない場合)、これも非常に冗長です。単純に電話する方がはるかに良いでしょう
myPerson.equals(mySsid)
しかし、Person equals クラスに文字列比較を追加すると、対称プロパティが壊れてしまいます。文字列は、それ自体を Person と比較する方法の手がかりを持っていないからです。
最後に、大きな問題は、オーバーライドされた equals メソッドを使用して、対称規則を破ることなく、この種の「簡略化された」比較を有効にする方法はありますか?
これについて考えてくれてありがとう!
編集:明確にするために、これは正確な解決策を求める問題というよりも未解決の問題です。equals は、コレクションから Person を抽出したい場合に対応する必要があります。したがって、次のようなことができるはずです。
List<Person> people = ...
people.get(ssid);
主キーに基づいてクラスの等価性を定義できることは明らかで直感的に見えますが、それを行う簡単な方法は見つかりませんでした。