web-dev-qa-db-fra.com

Eléments Java enum avec des espaces?

Je travaille sur Java, j'ai créé un enum comme suit:

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

L’exemple ci-dessus donne des erreurs lors de l’utilisation d’espace dans le nom de l’élément (par exemple, Amérique du Nord).

24
BSalunke

Vous ne pouvez pas insérer d'espace au milieu d'un identifiant. 

Cela met fin à cet identifiant et l'analyseur suppose que tout ce qui suit est un jeton valide dans le contexte de cette instruction. Il y a peu (le cas échéant) de lieux 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 d'utiliser toString pour fournir des représentations de couche présentation.

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

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

Les avantages de toString comprennent l’utilisation des 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 en valeur enum.

64
Dave Newton

Je vais y aller et deviner pourquoi vous voulez un espace dans le nom; parce que vous voulez le référencer en tant que chaîne.

Alors faites 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 du remplacement de toString () est que cette chaîne peut également être utilisée dans MyEnum .valueOf (myString). Donc, remplacer toString crée fondamentalement un HashMap des valeurs enum.

15
Joe

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

5
Scott Hunter

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

3
Tudor

La règle de nommage Java n'autorise pas les espaces blancs en tant que caractères possibles dans un nom de variables, classes, énumérations et membres énumérés (et tout autre identificateur). Par conséquent, ce "problème" ne peut pas être résolu. Il suffit d'utiliser nord_america comme nom de membre!

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

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

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

2
Matten
public enum myEnum
{
    india,
    russian,
    england,
    north_america
}

Accéder aux valeurs

myEnum.values()
1
Marc Nuri

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: "Amérique du Nord". Si la méthode ne trouve pas votre enum, 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
j2emanue

J'ai également introduit une méthode propre valueOf. Mais je reviens avec le type Enum et je n’ai pas à 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
matzeihnsein