Java enum – pourquoi utiliser toSsortingng au lieu de name

Si vous regardez dans le enum api au name() la méthode name() il est écrit que:

Renvoie le nom de cette constante enum, exactement comme déclaré dans sa déclaration enum. La plupart des programmeurs doivent utiliser la méthode toSsortingng de préférence à celle-ci, car la méthode toSsortingng peut renvoyer un nom plus convivial. Cette méthode est conçue principalement pour une utilisation dans des situations spécialisées où l’exactitude dépend de l’obtention du nom exact, qui ne variera pas d’une version à l’autre.

Pourquoi vaut-il mieux utiliser toSsortingng() ? Je veux dire que toSsortingng peut être remplacé lorsque name () est déjà final. Donc, si vous utilisez toSsortingng et que quelqu’un le remplace pour retourner une valeur codée en dur, toute votre application est désactivée … Aussi, si vous regardez dans les sources, la méthode toSsortingng () renvoie exactement le nom. C’est la même chose.

Cela dépend vraiment de ce que vous voulez faire avec la valeur renvoyée:

  • Si vous devez obtenir le nom exact utilisé pour déclarer la constante enum, vous devez utiliser name() car toSsortingng peut avoir été remplacé
  • Si vous souhaitez imprimer la constante enum de manière conviviale, vous devez utiliser toSsortingng qui peut avoir été remplacé (ou pas!).

Lorsque je pense que cela peut être déroutant, je getXXX méthode getXXX plus spécifique, par exemple:

 public enum Fields { LAST_NAME("Last Name"), FIRST_NAME("First Name"); private final Ssortingng fieldDescription; private Fields(Ssortingng value) { fieldDescription = value; } public Ssortingng getFieldDescription() { return fieldDescription; } } 

Utilisez name() lorsque vous souhaitez effectuer une comparaison ou utilisez la valeur codée en dur pour certaines utilisations internes dans votre code.

Utilisez toSsortingng() lorsque vous souhaitez présenter des informations à un utilisateur (y compris un développeur qui consulte un journal). Ne comptez jamais sur votre code sur toSsortingng() donner une valeur spécifique. Ne le testez jamais contre une chaîne spécifique. Si votre code casse quand quelqu’un modifie correctement le retour de toSsortingng() , alors il était déjà cassé.

Du javadoc (accent mis sur le mien):

Renvoie une représentation sous forme de chaîne de l’object. En général, la méthode toSsortingng renvoie une chaîne qui “représente textuellement” cet object. Le résultat devrait être une représentation concise mais informative, facile à lire pour une personne . Il est recommandé que toutes les sous-classes remplacent cette méthode.

name() est une méthode “intégrée” d’ enum . C’est final et vous ne pouvez pas changer sa mise en œuvre. Il retourne le nom de enum constant tel qu’il est écrit, par exemple en majuscule, sans espaces, etc.

Comparez MOBILE_PHONE_NUMBER et Mobile phone number . Quelle version est la plus lisible? Je crois le deuxième. C’est la différence: name() renvoie toujours MOBILE_PHONE_NUMBER , toSsortingng() peut être remplacé pour renvoyer Mobile phone number .

Alors que la plupart des gens suivent aveuglément les conseils du javadoc, il existe des situations très spécifiques dans lesquelles vous souhaitez réellement éviter toSsortingng (). Par exemple, j’utilise les énumérations dans mon code Java, mais elles doivent être sérialisées dans une firebase database, et inversement. Si j’utilisais toSsortingng (), je serais techniquement sujet à obtenir le comportement surchargé comme d’autres l’ont fait remarquer.

De plus, on peut aussi désérialiser la firebase database, par exemple, cela devrait toujours fonctionner en Java:

MyEnum taco = MyEnum.valueOf(MyEnum.TACO.name());

Considérant que cela n’est pas garanti:

MyEnum taco = MyEnum.valueOf(MyEnum.TACO.toSsortingng());

Au fait, je trouve très étrange que le Javadoc dise explicitement “la plupart des programmeurs devraient”. Je trouve très peu de cas d’utilisation dans le toSsortingng d’un enum, si les gens l’utilisent pour un “nom convivial” qui est clairement un mauvais cas d’utilisation car ils devraient utiliser quelque chose de plus compatible avec i18n, qui, dans la plupart des cas, utilisez la méthode name ().

name () est littéralement le nom textuel dans le code Java de l’énumération. Cela signifie qu’il est limité aux chaînes qui peuvent apparaître dans votre code Java, mais toutes les chaînes souhaitables ne sont pas exprimables dans le code. Par exemple, vous pouvez avoir besoin d’une chaîne commençant par un chiffre. name () ne pourra jamais obtenir cette chaîne pour vous.

Un exemple pratique lorsque name () et toSsortingng () ont un sens pour être différent est un modèle où une énumération à valeur unique est utilisée pour définir un singleton. Il semble surprenant au début, mais cela a beaucoup de sens:

 enum SingletonComponent { INSTANCE(/*..configuration...*/); /* ...behavior... */ @Override Ssortingng toSsortingng() { return "SingletonComponent"; // better than default "INSTANCE" } } 

Dans ce cas:

 SingletonComponent myComponent = SingletonComponent.INSTANCE; assertThat(myComponent.name()).isEqualTo("INSTANCE"); // blah assertThat(myComponent.toSsortingng()).isEqualTo("SingletonComponent"); // better