java - `Enum.name()` 和 `Enum.toString()` 有什么区别?

标签 java enums

阅读 String java.lang.Enum.name() 的文档后,我不确定我是否理解何时使用 name()以及何时使用 toString() .

Returns the name of this enum constant, exactly as declared in its enum declaration. Most programmers should use the toString method in preference to this one, as the toString method may return a more user-friendly name. This method is designed primarily for use in specialized situations where correctness depends on getting the exact name, which will not vary from release to release.

特别是,即使文档说更喜欢 toString(),Java 自己的 StandardLocation枚举使用 name 而我认为文档另有建议。

public String getName() { return name(); }

此外,EnumtoString() 实现为,

public String toString() {
    return name;
}

我想不出用户定义的枚举会覆盖 toString() 所以 name()toString() 的情况几乎总是完全相同。

  1. 您能否解释一下为什么忽略文档并始终使用 name() 是个坏主意?
  2. “不会因版本而异”这句话怎么样?如果名称不变,是否暗示 java.lang.Enum.toString() 会?

最佳答案

name()toString() 的主要区别在于 name()final方法,所以它不能被覆盖。 toString() 方法返回与 name() 默认相同的值,但 toString() 可以被 Enum 的子类覆盖。

因此,如果您需要字段本身的名称,请使用name()。如果您需要 字段值的字符串表示形式,请使用 toString()

例如:

public enum WeekDay {
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY;

    public String toString() {
        return name().charAt(0) + name().substring(1).toLowerCase();
    }
}

在这个例子中, WeekDay.MONDAY.name() 返回“MONDAY”,并且 WeekDay.MONDAY.toString() 返回“星期一”。

WeekDay.valueOf(WeekDay.MONDAY.name()) 返回 WeekDay.MONDAY,但 WeekDay.valueOf(WeekDay.MONDAY.toString()) 抛出 IllegalArgumentException

关于java - `Enum.name()` 和 `Enum.toString()` 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18031125/

相关文章:

Java + Mysql UTF8 问题

java - 如何从 Class<T> 推断 T 的方法

python - 如何在数据类模块的 asdict 函数中使用枚举值

enums - 如何跨一组枚举类编写可重用的字符串到枚举值的转换? ( Kotlin )

c++ - 以编程方式独立于其元素的值推断枚举的大小?

MySQL 曾经允许 CHAR 列 FK 到另一个表 ENUM 列,但现在不再了?

java - zip文件太大aws lambda java gradle

java - 检测圆圈与内部矩形之间的碰撞

java - 如何分割包含json数据的字符串

java - Prefuse Java 条形图