Jaki jest najlepszy sposób, aby enum
typ reprezentował zestaw ciągów?
Próbowałem tego:
enum Strings{
STRING_ONE("ONE"), STRING_TWO("TWO")
}
Jak mogę ich następnie użyć jako Strings
?
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();
private String text
powinien być ostateczny.final
byłaby najlepsza.new
tak jak konstruktorprivate
. Zasadniczo tworzenie obiektów jest zabronione ifinal
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ś tegopublic 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,
Uruchomienie następującego kodu testowego spowoduje:
źródło
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ąpieniemtoString()
; Uważam, że lepiej jest użyć jawnego modułu pobierającego, na przykładgetKey()
ponieważ zastąpienietoString()
może być nieoczekiwane przez innego użytkownika wyliczenia.Użyj swojej
name()
metody:daje
ONE
.źródło
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 klasAlbo 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:
Ważne jest, aby stałe były na górze, a metody / atrybuty na dole.
źródło
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)
lubString s = "Hello "+STRING_TWO
, ale kiedy naprawdę potrzebujesz Ciągów (np.STRING_ONE.toLowerCase()
), Możesz preferować zdefiniowanie ich jako stałych:źródło
toLowerCase()
mojego rozwiązania, mogą odejśćStrings.STRING_TWO.toString().toLowerCase()
.interface
zamiastfinal
klasy zprivate
konstruktorem. To zniechęcająca praktyka.Możesz użyć tego dla łańcucha Enum
I zadzwoń z głównej metody
źródło
Jeśli nie chcesz używać konstruktorów i chcesz mieć specjalną nazwę dla metody, spróbuj tego:
Podejrzewam, że jest to najszybsze rozwiązanie. Nie ma potrzeby używania zmiennych końcowych .
źródło
Uzyskaj i ustaw wartości domyślne.
źródło