Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当语义不同时,如何将两个相等的枚举常量表示为不相等?_Java_Enums_Overriding_Overloading_Equals - Fatal编程技术网

Java 当语义不同时,如何将两个相等的枚举常量表示为不相等?

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

我目前正在做一个tic-tac-toe游戏,我使用
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;}
?看来你想得太多了。如果
等于
的合同不符合您的需要,请不要使用它。