Si miras en la API de enumeración el método name()
dice que:
Devuelve el nombre de esta constante enum, exactamente como se declara 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 una versión a otra.
¿Por qué es mejor usar toString()
? Quiero decir que toString puede anularse cuando name () ya es final. Entonces, si usa toString y alguien lo anula para devolver un valor codificado, toda su aplicación está inactiva ... Además, si mira en las fuentes, el método toString () devuelve exactamente y solo el nombre. Es lo mismo.
toString()
en su enumeración, pero nadie más puede extenderla y anularla. No puedes extender las enumeraciones.Respuestas:
Realmente depende de lo que quieras hacer con el valor devuelto:
name()
comotoString
puede haberse anuladotoString
que puede haber sido anulada (¡o no!).Cuando siento que puede ser confuso, proporciono un
getXXX
método más específico , por ejemplo:fuente
Úselo
name()
cuando desee hacer una comparación o use el valor codificado para algún uso interno en su código.Úselo
toString()
cuando desee presentar información a un usuario (incluido un desarrollador que mira un registro). Nunca confíe en su código paratoString()
dar un valor específico. Nunca lo pruebe contra una cadena específica. Si su código se rompe cuando alguien cambia correctamente latoString()
devolución, entonces ya estaba roto.Del javadoc (énfasis mío):
fuente
name()
es un método "incorporado" deenum
. Es definitivo y no puede cambiar su implementación. Devuelve el nombre de enum constante tal como está escrito, por ejemplo, en mayúsculas, sin espacios, etc.Compara
MOBILE_PHONE_NUMBER
yMobile phone number
. ¿Qué versión es más legible? Yo creo el segundo. Esta es la diferencia:name()
siempre regresaMOBILE_PHONE_NUMBER
,toString()
puede ser anulado para regresarMobile phone number
.fuente
Mobile phone number
solo se devuelve si lo anula para devolver dicho valor. De lo contrario, volveráMOBILE_PHONE_NUMBER
toString()
. El problema es quename()
no se puede anular ya que es final.Si bien la mayoría de las personas siguen ciegamente los consejos del javadoc, hay situaciones muy específicas en las que desea evitar toString (). Por ejemplo, estoy usando enumeraciones en mi código Java, pero necesitan ser serializadas en una base de datos y volver a aparecer. Si solía toString (), técnicamente estaría sujeto a obtener el comportamiento anulado como otros han señalado.
Además, también se puede deserializar de la base de datos, por ejemplo, esto siempre debería funcionar en Java:
MyEnum taco = MyEnum.valueOf(MyEnum.TACO.name());
Mientras que esto no está garantizado:
MyEnum taco = MyEnum.valueOf(MyEnum.TACO.toString());
Por cierto, me parece muy extraño que el Javadoc diga explícitamente "la mayoría de los programadores deberían". Encuentro muy poco caso de uso en toString de una enumeración, si las personas lo usan para un "nombre descriptivo" que es claramente un caso de uso deficiente, ya que deberían estar usando algo más compatible con i18n, que, en la mayoría de los casos, usa el método name ().
fuente
Un ejemplo práctico cuando name () y toString () tienen sentido para ser diferentes es un patrón donde se usa una enumeración de un solo valor para definir un singleton. Parece sorprendente al principio, pero tiene mucho sentido:
En tal caso:
fuente
name () es literalmente el nombre textual en el código java de la enumeración. Eso significa que está limitado a cadenas que realmente pueden aparecer en su código Java, pero no todas las cadenas deseables se pueden expresar en el código. Por ejemplo, puede necesitar una cadena que comience con un número. name () nunca podrá obtener esa cadena por usted.
fuente
También puede usar algo como el código a continuación. Usé lombok para evitar escribir algunos de los códigos repetitivos para captadores y constructores.
fuente