Java 当语义不同时,如何将两个相等的枚举常量表示为不相等?
我目前正在做一个tic-tac-toe游戏,我使用Java 当语义不同时,如何将两个相等的枚举常量表示为不相等?,java,enums,overriding,overloading,equals,Java,Enums,Overriding,Overloading,Equals,我目前正在做一个tic-tac-toe游戏,我使用Stateenum跟踪单元格的值 protected static enum State { BLANK, X, O; @Override public String toString() { if (this.name().equals("BLANK")) return " "; else return this.name(); }
State
enum跟踪单元格的值
protected static enum State {
BLANK, X, O;
@Override
public String toString() {
if (this.name().equals("BLANK"))
return " ";
else
return this.name();
}
@Override
public boolean equals(Object o2) {
if (this == o2)
return true;
if (!(o2 instanceof State))
return false;
State state2 = (State)o2;
if (state2.name().equals("BLANK"))
return false;
return this.name().equals(state2.name());
}
};
如果必要的单元格相等,则可以确定获胜者。问题是,如果单元格为空白
,“BLANK”将获胜。我最初的想法是用上面的内容覆盖它,但这会产生一个编译错误,因为显然boolean equals(Object)
在枚举中是最终的(我知道这是因为)。因此,我的下一个想法是按照如下方式过载:
public boolean equals(State state2) {
if (state2.name().equals("BLANK"))
return false;
return this.name().equals(state2.name());
}
但是我们知道,因为像集合这样的东西只会查看equals(Object)
签名。这里的问题是,从语义上讲,空白单元格根本不存在;那里什么都没有,所以应该没有可以比较的东西来等于另一个空白单元格。另一个类似的例子是,如果我有一个数字枚举:enum Sign{Positive,Negative,NaN}
。将两个数字相乘并找到结果符号的一种有效方法是(假装计算机还没有处理符号):
if (this.sign.equals(number2.sign))
sign = Sign.Positive;
else
sign = Sign.Negative;
未定义的数字不能共享符号,因为它们未定义!你总是可以不雅观地检查,看看这个符号是否未定义,然后在那一点上改变一些东西,但这看起来非常落后和低效,因为它仍然必须检查平等性,并且做很多已经徒劳的工作。数字示例有点分崩离析,只需将其设为等于NaN,但我的观点是这确实不准确,而且我确信还有很多其他实例,其中两个枚举常量在语义上不相等,也不会像我的tic-tac-toe示例那样工作。在Java中是否有一种优雅的方式来处理这种情况?删除空白,并用
可选的(s)填充您的电路板;使用blank并修改win detector例程以忽略空白,删除空白并使用null
(s)。这些都是我脑海中浮现的选择。这会永远是一条路吗?或者这仅仅是解决一些问题的办法。如果每个问题都有一个通用的答案,那不是很好吗。@ElliottFrisch同样,在我的示例中,这至少会导致泛型数组创建出现问题……为什么不创建一个方法boolean samePlayer(声明){returnthis==that&&that!=BLANK;}
?看来你想得太多了。如果equals
的合同不符合您的需要,请不要使用它。删除空白,并用可选的(s)填充您的电路板;使用blank并修改win detector例程以忽略空白,删除空白并使用null
(s)。这些都是我脑海中浮现的选择。这会永远是一条路吗?或者这仅仅是解决一些问题的办法。如果每个问题都有一个通用的答案,那不是很好吗。@ElliottFrisch同样,在我的示例中,这至少会导致泛型数组创建出现问题……为什么不创建一个方法boolean samePlayer(声明){returnthis==that&&that!=BLANK;}
?看来你想得太多了。如果等于的合同不符合您的需要,请不要使用它。