Odpowiedzi:
Nie wiem, co chcesz zrobić, ale tak właśnie przetłumaczyłem twój przykładowy kod ...
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;
}
}
Alternatywnie możesz utworzyć metodę gettera dla text
.
Możesz teraz zrobić Strings.STRING_ONE.toString();
final
byłaby najlepsza.
new
tak jak konstruktor private
. Zasadniczo tworzenie obiektów jest zabronione i final
w tym przypadku nie jest tak naprawdę konieczne.
setText(String)
się do wyliczenia enum, co może rozpętać piekło :) final
rodzaj dokumentów, które zamierzają być stałe ze wsparciem kompilatora. Gdybyś użył String
stałych, nie zadeklarowałbyś tego public static String
, prawda?
Niestandardowe wartości ciągu dla wyliczenia
from http://javahowto.blogspot.com/2006/10/custom-string-values-for-enum.html
Domyślną wartością ciągu dla wyliczenia Java jest jego wartość nominalna lub nazwa elementu. Można jednak dostosować wartość ciągu, zastępując metodę toString (). Na przykład,
public enum MyType {
ONE {
public String toString() {
return "this is one";
}
},
TWO {
public String toString() {
return "this is two";
}
}
}
Uruchomienie następującego kodu testowego spowoduje:
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
katalogu: EnumTest $ MyType.class EnumTest $ MyType $ 1.class EnumTest $ MyType $ 2.class, który doda się naprawdę szybko. Najlepiej zrobić to jako oczekiwaną odpowiedź, przekazując wartości do konstruktora wyliczania. Właściwie nie zgadzam się z zastąpieniem toString()
; Uważam, że lepiej jest użyć jawnego modułu pobierającego, na przykład getKey()
ponieważ zastąpienie toString()
może być nieoczekiwane przez innego użytkownika wyliczenia.
Użyj swojej name()
metody:
public class Main {
public static void main(String[] args) throws Exception {
System.out.println(Strings.ONE.name());
}
}
enum Strings {
ONE, TWO, THREE
}
daje ONE
.
Strings.STRING_ONE.name()
daje „STRING_ONE”, a nie „JEDEN”. To po prostu nie jest dobra odpowiedź. Nie możesz mieć żadnego łańcucha, który nie byłby prawidłowym identyfikatorem Java itp.
name()
może mieć wpływ program zaciemniania. Jakiś czas temu napotkałem podobny problem. Na przykład w Proguard musisz obejść ten problem. Zobacz temat Przetwarzanie klas
Albo ustaw nazwę wyliczenia, aby była taka sama jak ciąg, który chcesz, lub, bardziej ogólnie, możesz powiązać dowolne atrybuty z wartościami wyliczenia:
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.
}
Ważne jest, aby stałe były na górze, a metody / atrybuty na dole.
W zależności od tego, co rozumiesz przez „używaj ich jako ciągów”, możesz nie chcieć używać tutaj wyliczenia. W większości przypadków rozwiązanie zaproponowane przez Elitarnego Dżentelmena pozwoli ci użyć ich za pomocą metod toString, np. W System.out.println(STRING_ONE)
lub String s = "Hello "+STRING_TWO
, ale kiedy naprawdę potrzebujesz Ciągów (np. STRING_ONE.toLowerCase()
), Możesz preferować zdefiniowanie ich jako stałych:
public interface Strings{
public static final String STRING_ONE = "ONE";
public static final String STRING_TWO = "TWO";
}
toLowerCase()
mojego rozwiązania, mogą odejść Strings.STRING_TWO.toString().toLowerCase()
.
interface
zamiast final
klasy z private
konstruktorem. To zniechęcająca praktyka.
Możesz użyć tego dla łańcucha 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;
}
}
I zadzwoń z głównej metody
public class Test {
public static void main (String args[]){
System.out.println(EnumTest.NAME_ONE.getName());
System.out.println(EnumTest.NAME_TWO.getName());
}
}
Jeśli nie chcesz używać konstruktorów i chcesz mieć specjalną nazwę dla metody, spróbuj tego:
public enum MyType {
ONE {
public String getDescription() {
return "this is one";
}
},
TWO {
public String getDescription() {
return "this is two";
}
};
public abstract String getDescription();
}
Podejrzewam, że jest to najszybsze rozwiązanie. Nie ma potrzeby używania zmiennych końcowych .
private String text
powinien być ostateczny.