web-dev-qa-db-fra.com

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 bien comprendre quand utiliser name () et quand utiliser toString () .

Renvoie le nom de cette constante enum, exactement comme indiqué dans sa déclaration enum. La plupart des programmeurs doivent 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 principalement conçue pour être utilisée dans des situations spécialisées où la correction dépend du nom exact, qui ne variera pas d’une publication à l’autre.

En particulier, même si la documentation dit préférer toString(), l'énumération StandardLocation de Java utilise name alors que j'aurais pensé que la documentation était différente.

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

De plus, Enum implémente 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() alors name() et toString() sont presque toujours identiques.

  1. Pouvez-vous s'il vous plaît expliquer pourquoi ignorer la documentation et toujours utiliser name() est une mauvaise idée?
  2. Qu'en est-il de l'expression "ne variera pas d'une publication à l'autre". Si le nom ne varie pas, cela implique-t-il que Java.lang.Enum.toString() le serait?
99
Micha Wiedenmann

La principale différence entre name() et toString() est que name() est une méthode final et ne peut donc pas être remplacée. La méthode toString() renvoie la même valeur que name() par défaut, mais toString() peut être remplacé par des sous-classes de Enum.

Par conséquent, si vous avez besoin du nom du champ lui-même, utilisez name(). Si vous avez besoin de représentation sous forme de chaîne de la valeur du champ, utilisez 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 "MONDAY" et WeekDay.MONDAY.toString() renvoie "Monday".

WeekDay.valueOf(WeekDay.MONDAY.name()) renvoie WeekDay.MONDAY, mais WeekDay.valueOf(WeekDay.MONDAY.toString()) lève un IllegalArgumentException.

180
Hans Brende

Utilisez toString () lorsque vous souhaitez présenter des informations à un utilisateur (y compris un développeur consultant un journal). Ne vous fiez jamais dans votre code à toString() donnant une valeur spécifique. Ne le testez jamais avec une chaîne spécifique. Si votre code se brise lorsque quelqu'un modifie correctement le retour toString(), il était déjà rompu.

Si vous devez obtenir le nom exact utilisé pour déclarer la constante enum, vous devez utiliser name () car toString a peut-être été remplacé.

18
Butani Vijay

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

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

13
Mehrdad