Java 覆盖枚举中的equal、toString、hashcode方法
我有一个枚举,如下所示Java 覆盖枚举中的equal、toString、hashcode方法,java,Java,我有一个枚举,如下所示 public enum Game { CRICKET("cricket"), FOOTBALL("football"), VOLLEYBALL("volleyball")' private String val; private Game(String val) { this.val = val; } public String getValue() { return this.
public enum Game {
CRICKET("cricket"),
FOOTBALL("football"),
VOLLEYBALL("volleyball")'
private String val;
private Game(String val) {
this.val = val;
}
public String getValue() {
return this.val;
}
}
在这里,我想覆盖equal()、hashCode()和toString()方法吗
基于此不,
enum
不是一个常规类(正如Andreas指出的,它们是最终的
方法)。例如,您不需要使用equals()
来比较它们,因为每个enum
值都有一个实例。这允许您改为使用=
if(gameType == Game.CRICKET)
您可以覆盖
toString()
,因为默认情况下,它打印的内容与name()
相同,这只是枚举的名称(例如FOOTBALL
)。我的第一个问题是为什么需要枚举首先包含字符串。枚举的要点看起来已经是在可能的游戏列表中区分每种类型的游戏。所以这里的枚举本身是一个常量值。例如,您可以执行以下操作:
public void playGame( Game myGame ){
switch(myGame){
case FOOTBALL:
playFootball();
break;
case CRICKET:
playCricket();
break;
// and so on but you get the point
}
这个问题毫无意义,因为您不能覆盖枚举的
equal()
和hashCode()
这是因为它们在类中被定义为
final
,该类隐式地是所有enum
类型的基类。enum值是常量,为什么需要equals()
和hashcode()
?唯一的问题是,最好使用private final String val代码>(或公共
)。我能知道吗?你为什么建议像上面的@joopeggen你在谈论正确的语义,可能的问题。除了Game.FOOTBAL.val应该是一个常量,然后(如果需要的话)它也可以是公共的,因为没有人可以这样做Game.FOOTBALL=“socker”代码>。这将使类在语义上100%正确。除了)“
一个)的打字错误代码>。这不仅仅是因为你不需要,事实上你不能,因为equal()
和hashCode()
是最终的
@Andreas我没有意识到这一点。但那更好!正如作者所说:这个方法可能会被重写,尽管它通常不是必需的或可取的。当存在更“程序员友好”的字符串形式时,枚举类型应重写此方法。--这就是为什么。toString方法呢?@cvaram96正如Enum的javadoc所说:这个方法可能会被重写,尽管它通常不是必需的或可取的。当存在更“程序员友好”的字符串形式时,枚举类型应重写此方法。