É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?
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.
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.
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.
Écrivez-les ensemble comme northAmerica
ou utilisez un trait de soulignement north_America
.
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).
public enum myEnum
{
india,
russian,
england,
north_america
}
Pour accéder aux valeurs
myEnum.values()
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;
}
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");
}
}