gpt4 book ai didi

无法确定是否相等时,Java 等于

转载 作者:搜寻专家 更新时间:2023-10-30 21:06:28 28 4
gpt4 key购买 nike

我想知道什么是正确的 Java 编程范式来覆盖类 C 对象的 equals(和 hashCode)方法,在以下情况下 (a) 有没有足够的信息来确定 C 的两个实例是否相等,或者 (b) 调用方法不应该能够确定 C 的两个实例是否相等。

例如,在我的项目中,我有一个 PlayingCard 类。在我看来,如果 PlayingCard 面朝上,那么调用方法应该可以访问它的属性,但如果面朝下,那么这些属性应该保持未知:

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 集合框架的缘故,如果两张扑克牌的点数和花色相同,则它们应该相等:

    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;
}
}

使用 getRank 和 getSuit` 方法似乎也不起作用:

    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 是否合适?感谢您的任何意见和想法。

最佳答案

您可以在 equals 方法中添加此条件:

if(this.isFaceDown || other.isFaceDown) return false;

我认为这是将牌面朝下完全隐藏的唯一方法。问题是,将其添加到集合中时,如果您要添加的卡片面朝下,则可能会出现重复。

关于无法确定是否相等时,Java 等于,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11104195/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com