Réponses:
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();
final
serait mieux.
new
le constructeur private
. Essentiellement, la création d'objets est interdite et final
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 des String
constantes, vous ne le déclareriez pas public 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,
public enum MyType {
ONE {
public String toString() {
return "this is one";
}
},
TWO {
public String toString() {
return "this is two";
}
}
}
L'exécution du code de test suivant produira ceci:
public class EnumTest {
public static void main(String[] args) {
System.out.println(MyType.ONE);
System.out.println(MyType.TWO);
}
}
this is one
this is two
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érogation toString()
; Je pense qu'il est préférable d'utiliser un getter explicite, getKey()
car le remplacement toString()
peut être inattendu par un autre utilisateur de l'énumération.
Utilisez sa name()
méthode:
public class Main {
public static void main(String[] args) throws Exception {
System.out.println(Strings.ONE.name());
}
}
enum Strings {
ONE, TWO, THREE
}
rendements ONE
.
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ération
Soit 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:
enum Strings {
STRING_ONE("ONE"), STRING_TWO("TWO");
private final String stringValue;
Strings(final String s) { stringValue = s; }
public String toString() { return stringValue; }
// further methods, attributes, etc.
}
Il est important d'avoir les constantes en haut et les méthodes / attributs en bas.
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)
ou String s = "Hello "+STRING_TWO
, mais lorsque vous avez vraiment besoin de Strings (par exemple STRING_ONE.toLowerCase()
), vous préférerez peut-être les définir comme constantes:
public interface Strings{
public static final String STRING_ONE = "ONE";
public static final String STRING_TWO = "TWO";
}
toLowerCase()
solution, ils peuvent y aller Strings.STRING_TWO.toString().toLowerCase()
.
interface
à la place d'une final
classe avec private
constructeur. C'est une pratique découragée.
Vous pouvez l'utiliser pour la chaîne Enum
public enum EnumTest {
NAME_ONE("Name 1"),
NAME_TWO("Name 2");
private final String name;
/**
* @param name
*/
private EnumTest(final String name) {
this.name = name;
}
public String getName() {
return name;
}
}
Et appel de la méthode principale
public class Test {
public static void main (String args[]){
System.out.println(EnumTest.NAME_ONE.getName());
System.out.println(EnumTest.NAME_TWO.getName());
}
}
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:
public enum MyType {
ONE {
public String getDescription() {
return "this is one";
}
},
TWO {
public String getDescription() {
return "this is two";
}
};
public abstract String getDescription();
}
Je soupçonne que c'est la solution la plus rapide . Il n'est pas nécessaire d'utiliser des variables finales .
private String text
devrait être définitive.