Éléments Java enum avec des espaces?

Je travaille sur java, j'ai créé une énumération comme suit:

public enum myEnum
{
    india,
    russian,
    england,
    north America
}

L'exemple ci-dessus donne des erreurs lors de l'utilisation de l'espace dans le nom de l'élément (c.-À-D. Amérique du Nord). Des suggestions comment résoudre le problème ci-dessus?

23
demandé sur A.H. 2011-12-05 21:16:39

8 réponses

Vous ne pouvez pas mettre un espace au milieu d'un identificateur.

Cela termine cet identifiant et l'analyseur suppose que tout ce qui vient ensuite est un jeton valide dans le contexte de cette instruction. Il y a peu d'endroits (voire aucun) qui seraient légaux.

Les noms de valeur Java conventionnels seraient:

INDIA,         // Or  India,
RUSSIA,        //     Russia,
NORTH_AMERICA; //     NorthAmerica;

Un enum peut avoir des propriétés associées, comme des noms lisibles par l'homme, par exemple,

public enum CountryAndOneContinent {

    INDIA("India"),
    RUSSIA("Russia"),
    NORTH_AMERICA("North America");

    private String displayName;

    CountryAndOneContinent(String displayName) {
        this.displayName = displayName;
    }

    public String displayName() { return displayName; }

    // Optionally and/or additionally, toString.
    @Override public String toString() { return displayName; }
}

Je suis ambivalent à propos de l'utilisation de toString pour fournir une couche de présentation représentation.

Je préfère les méthodes communiquent explicitement leur but–c'est plus expressif et évident.

toString est assez générique, et ne permet qu'une seule représentation. Plusieurs formats de sortie peuvent être requis en fonction du contexte, des paramètres, etc. ce que toString ne permet pas.

Les avantages de toString incluent l'utilisation d'opérations de chaîne par défaut sur l'objet, et dans ce cas, l'utilisation de valueOf pour traduire directement de la version lisible par l'homme à la valeur enum.

58
répondu Dave Newton 2013-06-17 14:53:51

Je suis gong pour aller de l'avant et deviner pourquoi vous voulez un espace dans le nom; parce que vous voulez le référencer comme une chaîne.

Faites donc ceci:

public enum MyEnum {
    INDIA("India"),
    RUSSIAN("Russian"),
    ENGLAND("England"),
    NORTH_AMERICA("North America");    

    private String name;

    MyEnum(String name) {
        this.name = name;
    }

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

Vous pouvez envisager de remplacer la chaîne.

public toString() {
    return name;
}

Un avantage de remplacer toString () est que cette chaîne peut également être utilisée dans MyEnum .valueOf (myString). Donc, surcharger toString crée essentiellement une HashMap des valeurs enum.

15
répondu Joe 2011-12-05 21:22:51

Le problème n'a rien (spécifiquement) à voir avec les énumérations: en Java, les noms ne peuvent pas avoir d'espaces. Essayez d'éliminer l'espace (en utilisant la capitalisation pour distinguer les bits) ou utilisez des traits de soulignement à la place.

5
répondu Scott Hunter 2011-12-05 17:19:42

Écrivez-les ensemble comme northAmerica ou utilisez un trait de soulignement north_America.

3
répondu Tudor 2011-12-05 17:17:43

La règle de nommage Java n'autorise pas les espaces blancs comme caractères possibles dans un nom de variables, de classes, d'énumérations et de membres enum (et de tout autre identifiant). Par conséquent, ce "problème" ne peut être résolu. Utilisez simplement "north_america" comme nom de membre!

Un identifiant est une séquence de lettres Java de longueur illimitée et Java chiffres, dont le premier doit être une lettre Java.

Les lettres Java incluent des lettres latines ASCII majuscules et minuscules A-Z (\u0041-\u005a), et a-z (\u0061-\u007a), et, pour l'historique raisons, le trait de soulignement ASCII ( _ , ou \u005f) et le signe dollar ( $ , ou \u0024). Le caractère $ ne doit être utilisé que dans code source ou, rarement, pour accéder aux noms préexistants sur les systèmes hérités.

Les "chiffres Java" incluent les chiffres ASCII 0-9 (\u0030-\u0039).

2
répondu Matten 2011-12-05 18:25:58
public enum myEnum
{
    india,
    russian,
    england,
    north_america
}

Pour accéder aux valeurs

myEnum.values()
1
répondu Marc Nuri 2011-12-05 17:18:04

Créez simplement votre propre fonction valueOf like dans votre classe enum. Remplacez les espaces par des traits de soulignement. nommez vos constantes enum comme ceci " north_america ("North America")". Si la méthode ne parvient pas à trouver votre énumération, elle renvoie simplement le paramètre.

public  static String valueOfOrDefault(String myValue) {
//replace space with underscore so it matches enum name
        String value=myValue.toUpperCase().replaceAll("\\s", "_");
        for(myEnum type : myEnum.class.getEnumConstants()) {
          if(type.name().equalsIgnoreCase(value)) {
            return type.toString();
          }
        }
        return myValue;
      }
1
répondu j2emanue 2014-09-27 05:04:10

J'ai également introduit une propre méthode valueOf. Mais je reviens avec le Type Enum et je n'ai pas besoin de convertir le "checkString"

CheckString est "petite caisse" par exemple.

JournalType journalType = JournalType.valueOfOrDefault(checkString);

public enum JournalType {

MISC_BILLING("Misc Billing"),
MISC_BILLING_AUTONUM("Misc Billing AutoNum"),
PRETTY_CASH("Petty Cash"),
RECURRING_AP("Recurring AP"),
GL_JOURNAL("GL Journal"),
GDS_NDS("GDS/NDS");

private final String journalType;

JournalType(String journalType) {
    this.journalType = journalType;
}

@Override
public String toString() {
    return journalType;
}

public static JournalType valueOfOrDefault(String myValue) {
    for(JournalType type : JournalType.class.getEnumConstants()) {
        if(type.toString().equals(myValue)) {
            return type;
        }
    }
   throw new IllegalArgumentException("JournalType not found");
}

}
0
répondu matzeihnsein 2018-03-05 11:20:35