同じクラスの o1 と o2 という 2 つのオブジェクトがあります。
の場合o1.hashcode() == o2.hashcode()
、それらが同じオブジェクトであると言えますか?
以外に、シングルトンo1==o2
に伝える他の方法はありますか。
クラスのインスタンスが 1 つしかない場合、==
と のequals
比較は常に を返しtrue
ます。
ただし、 はhashcode
異なるオブジェクトで等しい可能性があるため、ハッシュコードが等しいだけでは等しいとは限りません。
ここhashcode
にとequals
コントラクトのわかりやすい説明があります。
インスタンスが等しいと見なされるだけで、シングルトンがあることを確認するには、等しいかどうかを確認するだけでは不十分です。
Java クラスの単一のインスタンスが必要な場合は、静的メンバーとメソッドを使用することをお勧めします。
ここでは、シングルトンへのいくつかのアプローチが示されています。
EDIT:エモリーが指摘したように、実際にはオーバーライドequals
してランダムなものを返すことができ、必要な反射率(x.equals(x) == true
)に違反する可能性があります。Java では演算子をオーバーライドできない==
ため、同一のオブジェクトを特定する唯一の信頼できる方法です。
いいえ、異なるオブジェクトが同じを持つことができますhashCode()
:
"hypoplankton".hashCode()
"unheavenly" .hashCode()
どちらも同じ427589249
ハッシュ値を返しますが、明らかに等しくはありません。
あなたの質問(タイトルから)はhashCode()
「同じオブジェクトに対して常に同じ値を返す」ようです...答えはnoです。
実装は自由に何でも返すことができますが、適切に動作させるには、同じオブジェクトに対して同じものを返す必要があります。たとえば、これは有効ですが、貧弱な実装です。
@Override
public int hashCode() {
return (int) (Math.random() * Integer.MAX_VALUE);
}