equals
(a) C の 2 つのインスタンスが等しいかどうかを判断するのに十分な情報がない場合、または( hashCode
b) 呼び出しメソッドC の 2 つのインスタンスが等しいかどうかを判断できないはずです。
たとえば、私のプロジェクトでは、PlayingCard
クラスがあります。PlayingCard
aが表向きの場合、呼び出しメソッドはそのプロパティにアクセスできるように思われますが、裏向きの場合、それらのプロパティは不明のままにする必要があります。
class PlayingCard {
private Rank rank;
private Suit suit;
private boolean isFaceDown;
public PlayingCard(Rank rank, Suit suit, boolean isFaceDown) {
this.rank = rank;
this.suit = suit;
this.isFaceDown = isFaceDown;
}
public Rank getRank() { return isFaceDown ? null : rank; }
public Suit getSuit() { return isFaceDown ? null : suit; }
また、Java Collections Framework のために、2 枚のトランプ カードが同じランクとスーツを持っている場合、それらは等しくなければならないようです。
public boolean equals(Object obj) { // attempt #1
if(this == obj) return true;
if(obj == null) return false;
if(!(obj instanceof PlayingCard)) return false;
PlayingCard other = (PlayingCard) obj;
if(rank != other.rank) return false;
if(suit != other.suit) return false;
return true;
}
}
しかし、それはあまりにも多くの情報を明らかにします:
class Malicious {
public Rank determineRankOfFaceDownCard(PlayingCard faceDownCard) {
Set<PlayingCard> allCards = /* a set of all 52 PlayingCards face up */;
for(PlayingCard c : allCards) {
if(c.equals(faceDownCard)) {
return c.getRank();
}
}
return null;
}
}
および getSuit` メソッドを使用してgetRank
も機能しないようです。
public boolean equals(Object obj) { // attempt #1
if(this == obj) return true;
if(obj == null) return false;
if(!(obj instanceof PlayingCard)) return false;
PlayingCard other = (PlayingCard) obj;
if(getRank() != other.getRank()) return false;
if(getSuit() != other.getSuit()) return false;
return true;
}
}
/* outside the PlayingCard class */
Set<PlayingCard> s = new HashSet<PlayingCard>();
s.add(new PlayingCard(Rank.ACE, Suit.SPADES, true));
s.contains(new PlayingCard(Rank.TWO, Rank.HEARTS, true)); // returns true
他の開発者はこの状況にどのように対処しましたか? これは、ある種の投げるのRuntimeException
が適切な状況ですか? ご意見やアイデアをお寄せいただきありがとうございます。