172 votes

Quelle est la différence entre `Enum.name()` et `Enum.toString()` ?

Après avoir lu la documentation de String java.lang.Enum.name() Je ne suis pas sûr de comprendre quand utiliser nom() et quand utiliser toString() .

Renvoie le nom de cette constante d'enum, exactement comme il est déclaré dans sa déclaration d'enum. La plupart des programmeurs devraient utiliser la méthode toString de préférence à celle-ci, car la méthode toString peut renvoyer un nom plus convivial. Cette méthode est conçue principalement pour être utilisée 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.

En particulier, même si la documentation indique qu'il faut préférer toString() , le propre de Java StandardLocation l'énumération utilise name alors que j'aurais pensé que la documentation suggérait le contraire.

public String getName() { return name(); }

En outre, Enum met en œuvre toString() comme,

public String toString() {
    return name;
}

et je ne peux pas penser à une situation où une énumération définie par l'utilisateur écraserait toString() donc name() y toString() sont presque toujours exactement les mêmes.

  1. Pouvez-vous expliquer pourquoi le fait d'ignorer la documentation et de toujours utiliser name() est une mauvaise idée ?
  2. Que penser de la phrase "ne variera pas d'une version à l'autre". Si le nom ne variera pas, cela implique-t-il que java.lang.Enum.toString() le feraient-ils ?

283voto

Hans Brende Points 3185

La principale différence entre name() y toString() c'est que name() est un final et ne peut donc pas être remplacée. Le site toString() renvoie la même valeur que la méthode name() le fait par défaut, mais toString() peut être surchargée par les sous-classes de Enum.

Par conséquent, si vous avez besoin du nom du champ lui-même utiliser name() . Si vous avez besoin d'un représentation en chaîne de la valeur du champ utiliser toString() .

Par exemple :

public enum WeekDay {
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY;

    public String toString() {
        return name().charAt(0) + name().substring(1).toLowerCase();
    }
}

Dans cet exemple, WeekDay.MONDAY.name() renvoie "LUNDI", et WeekDay.MONDAY.toString() retourne "lundi".

WeekDay.valueOf(WeekDay.MONDAY.name()) renvoie à WeekDay.MONDAY mais WeekDay.valueOf(WeekDay.MONDAY.toString()) lance un IllegalArgumentException .

33voto

Butani Vijay Points 1641

Utilisez toString() lorsque vous souhaitez présenter des informations à un utilisateur (notamment un développeur qui consulte un journal). Ne comptez jamais dans votre code sur toString() donnant une valeur spécifique. Ne le testez jamais contre une chaîne de caractères spécifique. Si votre code se casse lorsque quelqu'un modifie correctement le toString() retour, alors il était déjà cassé.

Si vous avez besoin d'obtenir le nom exact utilisé pour déclarer la constante enum, vous devez utiliser nom() comme toString peut avoir été remplacée.

21voto

Mehrdad Points 70493

Utilisez toString lorsque vous devez afficher le nom à l'utilisateur.

Utilisez name lorsque vous avez besoin du nom pour votre programme lui-même, par exemple pour identifier et différencier les différentes valeurs de l'enum.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X