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所说:这个方法可能会被重写,尽管它通常不是必需的或可取的。当存在更“程序员友好”的字符串形式时,枚举类型应重写此方法。