java - values - ¿Cuál es la diferencia entre `Enum.name()` y `Enum.toString()`?
java enum with values (3)
Esta pregunta ya tiene una respuesta aquí:
- Enum de Java: por qué usar toString en vez de nombre 6 respuestas
Después de leer la documentación de String java.lang.Enum.name()
no estoy seguro de entender cuándo usar name() y cuándo usar toString() .
Devuelve el nombre de esta constante enum, exactamente como se declaró en su declaración enum. La mayoría de los programadores deben usar el método toString con preferencia a este, ya que el método toString puede devolver un nombre más fácil de usar. Este método está diseñado principalmente para su uso en situaciones especializadas donde la corrección depende de obtener el nombre exacto, que no variará de un lanzamiento a otro.
En particular, aunque la documentación dice que prefiere toString()
, la enumeración de la ubicación StandardLocation Java usa el name
cuando pensé que la documentación sugería lo contrario.
public String getName() { return name(); }
Además, Enum
implementa toString()
como,
public String toString() {
return name;
}
y no puedo pensar en una situación en la que una enumeración definida por el usuario sobrescriba toString()
por lo que name()
y toString()
son casi siempre exactamente iguales.
- ¿Puedes explicar por qué ignorar la documentación y usar siempre el
name()
es una mala idea? - ¿Qué pasa con la frase "no variará de lanzamiento a lanzamiento". Si el nombre no varía, ¿implica que
java.lang.Enum.toString()
haría?
La principal diferencia entre name()
y toString()
es que el name()
es un método final
, por lo que no se puede anular. El método toString()
devuelve el mismo valor que name()
de forma predeterminada, pero toString()
puede ser anulado por subclases de Enum.
Por lo tanto, si necesita el nombre del campo en sí , use el name()
. Si necesita una representación de cadena del valor del campo , use toString()
.
Por ejemplo:
public enum WeekDay {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY;
public String toString() {
return name().charAt(0) + name().substring(1).toLowerCase();
}
}
En este ejemplo, WeekDay.MONDAY.name()
devuelve "MONDAY", y WeekDay.MONDAY.toString()
devuelve "Monday".
WeekDay.valueOf(WeekDay.MONDAY.name())
devuelve WeekDay.MONDAY
, pero WeekDay.valueOf(WeekDay.MONDAY.toString())
arroja una IllegalArgumentException
.
Use toString
cuando necesite mostrar el nombre al usuario.
Use el name
cuando necesite el nombre de su programa , por ejemplo, para identificar y diferenciar entre las diferentes enumeraciones.
Use toString () cuando quiera presentar información a un usuario (incluido un desarrollador que mira un registro). Nunca confíe en su código en toString()
dando un valor específico. Nunca lo pruebe contra una cuerda específica. Si su código se rompe cuando alguien cambia correctamente el retorno toString()
, entonces ya estaba roto.
Si necesita obtener el nombre exacto utilizado para declarar la constante enum, debe usar el nombre () ya que se puede haber toString
cadena.