在Java中的枚举上使用==可以吗?

2022-08-31 09:08:19

是否可以在Java中的枚举上使用,或者我需要使用?在我的测试中,总是有效的,但我不确定我是否能保证这一点。特别是,枚举上没有方法,因此我不知道是否有可能获得枚举,其将返回与 不同的值。==.equals()==.clone().equals()==

例如,这样可以吗:

public int round(RoundingMode roundingMode) {
  if(roundingMode == RoundingMode.HALF_UP) {
    //do something
  } else if (roundingMode == RoundingMode.HALF_EVEN) {
    //do something
  }
  //etc
}

还是我需要这样写:

public int round(RoundingMode roundingMode) {
  if(roundingMode.equals(RoundingMode.HALF_UP)) {
    //do something
  } else if (roundingMode.equals(RoundingMode.HALF_EVEN)) {
    //do something
  }
  //etc
}

答案 1

只是我的2美分:这是Enum.java的代码,由Sun发布,也是JDK的一部分:

public abstract class Enum<E extends Enum<E>>
    implements Comparable<E>, Serializable {

    // [...]

    /**
     * Returns true if the specified object is equal to this
     * enum constant.
     *
     * @param other the object to be compared for equality with this object.
     * @return  true if the specified object is equal to this
     *          enum constant.
     */
    public final boolean equals(Object other) { 
        return this==other;
    }


}

答案 2

是的,== 很好 - 保证每个值只有一个引用。

但是,有更好的方法来编写圆形方法:

public int round(RoundingMode roundingMode) {
  switch (roundingMode) {
    case HALF_UP:
       //do something
       break;
    case HALF_EVEN:
       //do something
       break;
    // etc
  }
}

更好的方法是将功能放在枚举本身中,这样您就可以调用 。这就触及了Java枚举的核心 - 它们是面向对象的枚举,与其他地方的“命名值”不同。roundingMode.round(someValue)

编辑:规范不是很清楚,但第8.9节指出:

枚举类型的主体可以包含枚举常量。枚举常量定义枚举类型的实例。枚举类型除了由其枚举常量定义的实例外,没有其他实例。