sách gpt4 ăn đã đi

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

In lại 作者:搜寻专家 更新时间:2023-10-30 21:06:28 28 4
mua khóa gpt4 giày nike

我想知道什么是正确的 Java 编程范式来覆盖类 C 对象的 bằng nhau(和 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;
trả về giá trị đúng;
}
}

但这揭示了太多信息:

class Malicious {

public Rank determineRankOfFaceDownCard(PlayingCard faceDownCard) {
Set allCards = /* a set of all 52 PlayingCards face up */;
for(PlayingCard c : allCards) {
if(c.equals(faceDownCard)) {
return c.getRank();
}
}
trả về giá trị null;
}
}

sử dụng 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;
trả về giá trị đúng;
}
}

/* outside the PlayingCard class */

Set s = new HashSet();
s.add(new PlayingCard(Rank.ACE, Suit.SPADES, true));
s.contains(new PlayingCard(Rank.TWO, Rank.HEARTS, true)); // returns true

其他开发者是如何处理这种情况的?在这种情况下抛出某种 RuntimeException 是否合适?感谢您的任何意见和想法。

câu trả lời hay nhất

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

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

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

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

28 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress