2012-06-01 14 views
6

Acabo de notar que los estados Enum#toString javadoc (el énfasis es mío):Reemplazar Enum # toString no es deseable?

devuelve el nombre de esta constante de enumeración, tal como figura en la declaración. Este método puede ser anulado, aunque normalmente no es necesario o como deseable. Un tipo de enumeración debe anular este método cuando existe una cadena de caracteres más "amigable con el programador".

Por defecto, toString() y name() devolver la misma cosa, por lo que incluso una vez toString ha sido anulado, todavía se puede acceder al nombre de la enumeración a través del método name().

¿Alguien sabe por qué anular Enum#toString no sería deseable?

EDIT: Como referencia, javadoc name() 's (énfasis como en el original):

devuelve el nombre de esta constante de enumeración, tal y como declaró en su declaración de enumeración. 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.

+0

Un ejemplo de cuándo podría ser deseable podría ser cuando existe una convención de codificación existente de que los valores enum deben nombrarse en mayúsculas (por ejemplo, 'VALOR '), pero eso parecería torpe a un usuario, por lo que' toString' podría implementarse para devolver 'name.toLowerCase()' o alguna otra manipulación de caso. – jpm

+0

Mi caso de uso es que la enumeración representa un conjunto de opciones que se muestran al usuario (por ejemplo, en un 'JComboBox'). Mi primera inclinación fue anular 'toString' para proporcionar un nombre de visualización localizado para el usuario, pero el javadoc sugirió que solo se reemplazara para obtener un mejor formato de cadena" apto para programadores "que me hiciera creer que no era apropiado para usarlo como forma "fácil de usar". Sin embargo, el comentario en el javadoc para 'name()' sugiere que 'toString()' está diseñado para devolver un nombre * user * -friendly que me lleva a creer que el javadoc para 'toString' debería ser igual de fácil de usar en lugar. –

Respuesta

1

Creo que simplemente hay cierta confusión con respecto al significado de la palabra "deseable" aquí. El javadoc básicamente dice lo mismo dos veces: la anulación de toString() generalmente no es necesaria para que la enumeración funcione y, por lo tanto, no es útil (deseable) hacerlo.

Así que para responder a su pregunta: sería no ser deseable para anular toString() si: a) está seguro de que usted nunca tendrá que mostrar una representación de cadena del nombre de la enumeración, o B) la cadena predeterminada la representación es suficiente para identificar la enumeración si fuera necesario.

+0

No soy un hablante nativo de inglés. Pensé que no deseaba decir "debería evitarse". Tu explicación tendría sentido. – assylias

+0

Sí, creo que para dejarlo más claro, podría reemplazar "deseable" con la palabra "recomendado". – Seth

3

Con una enumeración, tiene un conjunto específico de valores constantes. Cuando se llama al método toString para esa enumeración, normalmente se esperaría que se devolviera el nombre, por lo que sobrescribir el método toString devolvería resultados algo inesperados.

+1

Derecha.cuando dicen que no es deseable, probablemente no significan "realmente no deberías hacer esto", sino "detente y piensa por un segundo si realmente tienes una buena razón para hacerlo". Todo se reduce a proporcionar a los clientes el comportamiento menos confuso. – jpm

+2

Si realmente quiero obtener el nombre del valor enum tal como está declarado, invoco el nombre, no aString. – assylias

+1

Sí, puede hacer cualquiera de las dos cosas, pero dado que String está predeterminado para nombrar, la mayoría espera que el nombre sea el valor de retorno ... especialmente dado que el objetivo de una enumeración es tener un conjunto de valores constantes. Al llamar directamente al nombre, se está asegurando de obtener el resultado esperado. Ciertamente podría sobrescribir toString si necesita un formato alternativo o lo que sea. – Seth

2

Si sus enumeraciones son más complejas que solo sus nombres, p. si contienen campos privados, se puede anular toSting() para imprimirlos y dar una mejor explicación del campo enum que solo su nombre.

+1

Mi pregunta es la contraria: ¿por qué no sería deseable hacer lo que describes? – assylias

+0

Bueno, como la documentación dice que ** por lo general ** no es necesario ni necesario, considero que a menos que tenga una estructura "compleja" en su enumeración, no es necesario. No tengo la sensación de que el autor de la documentación diga "No debe anular, es una mala idea" –

Cuestiones relacionadas