Quelle est la meilleure façon d'avoir un enum
type représentant un ensemble de chaînes?
J'ai essayé ceci:
enum Strings{
STRING_ONE("ONE"), STRING_TWO("TWO")
}
Comment puis-je les utiliser comme Strings
?
Je ne sais pas ce que vous voulez faire, mais c'est ainsi que j'ai traduit votre exemple de code ...
package test;
/**
* @author The Elite Gentleman
*
*/
public enum Strings {
STRING_ONE("ONE"),
STRING_TWO("TWO")
;
private final String text;
/**
* @param text
*/
Strings(final String text) {
this.text = text;
}
/* (non-Javadoc)
* @see java.lang.Enum#toString()
*/
@Override
public String toString() {
return text;
}
}
Vous pouvez également créer une méthode getter pour text
.
Vous pouvez maintenant faire Strings.STRING_ONE.toString();
private String text
devrait être définitive.final
serait mieux.new
le constructeurprivate
. Essentiellement, la création d'objets est interdite etfinal
n'est pas vraiment nécessaire dans ce cas.setText(String)
sur l'énumération et cela peut déclencher l'enfer :)final
genre de documents votre intention que ce soit une constante avec le support du compilateur. Si vous deviez utiliser desString
constantes, vous ne le déclareriez paspublic static String
, non?Valeurs de chaîne personnalisées pour Enum
depuis http://javahowto.blogspot.com/2006/10/custom-string-values-for-enum.html
La valeur de chaîne par défaut pour java enum est sa valeur nominale ou le nom de l'élément. Cependant, vous pouvez personnaliser la valeur de chaîne en remplaçant la méthode toString (). Par exemple,
L'exécution du code de test suivant produira ceci:
la source
bin
répertoire: EnumTest $ MyType.class EnumTest $ MyType $ 1.class EnumTest $ MyType $ 2.class qui s'additionnera très rapidement. Il vaut mieux le faire comme réponse attendue, en passant des valeurs au constructeur enum. En fait, je suis en désaccord avec la dérogationtoString()
; Je pense qu'il est préférable d'utiliser un getter explicite,getKey()
car le remplacementtoString()
peut être inattendu par un autre utilisateur de l'énumération.Utilisez sa
name()
méthode:rendements
ONE
.la source
Strings.STRING_ONE.name()
donne "STRING_ONE", pas "ONE". Ce n'est tout simplement pas une bonne réponse. Vous ne pouvez pas avoir de chaîne qui ne serait pas un identifiant Java valide, etc.name()
peut être affecté par un programme d'obscurcisseur. J'ai rencontré un problème similaire il y a quelque temps. Par exemple, avec Proguard, vous devez contourner ce problème. Voir Traitement des classes d'énumérationSoit définissez le nom d'énumération comme étant la chaîne que vous souhaitez, soit, plus généralement, vous pouvez associer des attributs arbitraires à vos valeurs d'énumération:
Il est important d'avoir les constantes en haut et les méthodes / attributs en bas.
la source
Selon ce que vous entendez par «les utiliser comme chaînes», vous ne voudrez peut-être pas utiliser une énumération ici. Dans la plupart des cas, la solution proposée par The Elite Gentleman vous permettra de les utiliser via leurs méthodes toString, par exemple dans
System.out.println(STRING_ONE)
ouString s = "Hello "+STRING_TWO
, mais lorsque vous avez vraiment besoin de Strings (par exempleSTRING_ONE.toLowerCase()
), vous préférerez peut-être les définir comme constantes:la source
toLowerCase()
solution, ils peuvent y allerStrings.STRING_TWO.toString().toLowerCase()
.interface
à la place d'unefinal
classe avecprivate
constructeur. C'est une pratique découragée.Vous pouvez l'utiliser pour la chaîne Enum
Et appel de la méthode principale
la source
Si vous ne souhaitez pas utiliser de constructeurs et que vous souhaitez avoir un nom spécial pour la méthode, essayez-le comme suit:
Je soupçonne que c'est la solution la plus rapide . Il n'est pas nécessaire d'utiliser des variables finales .
la source
Obtenez et définissez avec les valeurs par défaut.
la source