Se você olhar na enum api no método, name()
ele diz que:
Retorna o nome dessa constante enum, exatamente como declarado em sua declaração enum. A maioria dos programadores deve usar o método toString em preferência a este, pois o método toString pode retornar um nome mais amigável. Esse método foi desenvolvido principalmente para uso em situações especializadas em que a correção depende da obtenção do nome exato, que não varia de versão para versão.
Por que é melhor usar toString()
? Quero dizer, ToString pode ser substituído quando name () já é final. Portanto, se você usar toString e alguém o substituir para retornar um valor codificado, todo o aplicativo estará inativo ... Além disso, se você procurar nas fontes, o método toString () retornará exatamente e apenas o nome. É a mesma coisa.
toString()
sua enumeração, mas ninguém mais pode estendê-la e substituí-la. Você não pode estender enums.Respostas:
Realmente depende do que você deseja fazer com o valor retornado:
name()
comotoString
pode ter sido substituídotoString
que pode ter sido substituído (ou não!).Quando sinto que pode ser confuso, forneço um
getXXX
método mais específico , por exemplo:fonte
Use
name()
quando quiser fazer uma comparação ou use o valor codificado para algum uso interno do seu código.Use
toString()
quando quiser apresentar informações a um usuário (incluindo um desenvolvedor que esteja visualizando um log). Nunca confie no seu código paratoString()
fornecer um valor específico. Nunca teste contra uma sequência específica. Se o seu código quebrar quando alguém alterar corretamente otoString()
retorno, ele já estará quebrado.Do javadoc (ênfase minha):
fonte
name()
é um método "interno" deenum
. É final e você não pode alterar sua implementação. Retorna o nome da constante enum como está escrito, por exemplo, em maiúsculas, sem espaços etc.Compare
MOBILE_PHONE_NUMBER
eMobile phone number
. Qual versão é mais legível? Eu acredito no segundo. Esta é a diferença:name()
sempre retornaMOBILE_PHONE_NUMBER
,toString()
pode ser cancelado para retornarMobile phone number
.fonte
Mobile phone number
apenas se você substituí-lo para retornar esse valor. Caso contrário, ele irá retornarMOBILE_PHONE_NUMBER
toString()
. O problema é quename()
não pode ser substituído, pois é final.Enquanto a maioria das pessoas segue cegamente os conselhos do javadoc, há situações muito específicas em que você deseja realmente evitar toString (). Por exemplo, estou usando enumerações no meu código Java, mas elas precisam ser serializadas em um banco de dados e vice-versa. Se eu usasse toString (), estaria tecnicamente sujeito a obter o comportamento substituído, como outros já apontaram.
Além disso, também é possível desserializar do banco de dados, por exemplo, isso sempre deve funcionar em Java:
MyEnum taco = MyEnum.valueOf(MyEnum.TACO.name());
Considerando que isso não é garantido:
MyEnum taco = MyEnum.valueOf(MyEnum.TACO.toString());
A propósito, acho muito estranho para o Javadoc dizer explicitamente "a maioria dos programadores deveria". Eu acho muito pouco caso de uso no toString de uma enumeração, se as pessoas o usarem para um "nome amigável", esse é claramente um caso de uso ruim, pois deveriam estar usando algo mais compatível com o i18n, o que, na maioria dos casos, use o método name ().
fonte
Um exemplo prático em que name () e toString () fazem sentido para ser diferente é um padrão em que enum com valor único é usado para definir um singleton. Parece surpreendente no começo, mas faz muito sentido:
Nesse caso:
fonte
name () é literalmente o nome textual no código java da enumeração. Isso significa que está limitado a strings que podem realmente aparecer no seu código java, mas nem todas as strings desejáveis são expressas no código. Por exemplo, você pode precisar de uma sequência que comece com um número. name () nunca poderá obter essa string para você.
fonte
Você também pode usar algo como o código abaixo. Eu usei o lombok para evitar escrever alguns dos códigos padrão para getters e construtores.
fonte