Yanıtlar:
Ne yapmak istediğini bilmiyorum, ama aslında örnek kodunu bu şekilde tercüme ettim ....
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;
}
}
Alternatif olarak, için bir alıcı yöntemi oluşturabilirsiniz text
.
Şimdi yapabilirsin Strings.STRING_ONE.toString();
final
en iyisi olurdu.
new
yapıcı olarak private
. Esasen, nesne oluşturulması yasaktır ve final
bu durumda gerçekten gerekli değildir.
setText(String)
numaralandırma koymak için meyilli olabilir ve bu cehennem açığa :) final
tür belge derleyici desteği ile sabit olduğunu niyetinizi. Eğer String
sabitleri kullanacak olsaydınız, bunu beyan etmezdiniz public static String
, değil mi?
Numaralandırma için Özel Dize Değerleri
dan http://javahowto.blogspot.com/2006/10/custom-string-values-for-enum.html
Java enum için varsayılan dize değeri, yüz değeri veya öğe adıdır. Ancak, toString () yöntemini geçersiz kılarak dize değerini özelleştirebilirsiniz. Örneğin,
public enum MyType {
ONE {
public String toString() {
return "this is one";
}
},
TWO {
public String toString() {
return "this is two";
}
}
}
Aşağıdaki test kodunu çalıştırmak bunu üretecektir:
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
EnumTest $ MyType.class EnumTest $ MyType $ 1.sınıf EnumTest $ MyType $ 2.Sınıf yukarı katacak: dizine gerçek çabuk. Enum yapıcısına değerler ileterek beklenen cevap olarak yapmak en iyisidir. Aslında geçersiz kılmaya katılmıyorum toString()
; getKey()
Geçersiz kılma toString()
enum başka bir kullanıcı tarafından beklenmedik olabilir gibi açık bir alıcı kullanmak daha iyi olduğuna inanıyorum .
name()
Yöntemini kullanın :
public class Main {
public static void main(String[] args) throws Exception {
System.out.println(Strings.ONE.name());
}
}
enum Strings {
ONE, TWO, THREE
}
verim ONE
.
Strings.STRING_ONE.name()
"ONE" değil "STRING_ONE" veriyor. Bu sadece iyi bir cevap değil. Geçerli bir Java tanımlayıcısı vb
name()
bir gizleme programından etkilenebilir. Bir süre önce benzer bir sorunla karşılaştım. Örneğin, Proguard ile bu sorunu çözmeniz gerekir. Bkz. Sayım Sınıflarını İşleme
Numaralandırma adını istediğiniz dizeyle aynı olacak şekilde ayarlayın veya daha genel olarak rasgele öznitelikleri numaralandırma değerlerinizle ilişkilendirebilirsiniz:
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.
}
Sabitleri en üstte, yöntemleri / öznitelikleri en altta tutmak önemlidir.
"Onları Dizeler olarak kullan" ile ne demek istediğinize bağlı olarak, burada bir numaralandırma kullanmak istemeyebilirsiniz. Çoğu durumda, The Elite Gentleman tarafından önerilen çözüm, bunları toString yöntemleriyle kullanmanıza izin verecektir, örneğin System.out.println(STRING_ONE)
veya içinde String s = "Hello "+STRING_TWO
, ancak gerçekten Dizelere (örneğin STRING_ONE.toLowerCase()
) ihtiyacınız olduğunda , bunları sabit olarak tanımlamayı tercih edebilirsiniz:
public interface Strings{
public static final String STRING_ONE = "ONE";
public static final String STRING_TWO = "TWO";
}
toLowerCase()
benim çözümümü de istiyorlarsa, gidebilirler Strings.STRING_TWO.toString().toLowerCase()
.
interface
bir final
sınıf yerine kullanmamalısınız private
. Cesareti kırılmış bir uygulamadır.
Enum dizesi için bunu kullanabilirsiniz
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;
}
}
Ve ana yöntemden çağrı
public class Test {
public static void main (String args[]){
System.out.println(EnumTest.NAME_ONE.getName());
System.out.println(EnumTest.NAME_TWO.getName());
}
}
Eğer varsa yok kullanmak istediğiniz Kurucular ve bir olmasını istediğiniz özel isim yöntemi için, onu bu deneyin:
public enum MyType {
ONE {
public String getDescription() {
return "this is one";
}
},
TWO {
public String getDescription() {
return "this is two";
}
};
public abstract String getDescription();
}
Bunun en hızlı çözüm olduğundan şüpheleniyorum . Final değişkenlerini kullanmaya gerek yoktur .
private String text
nihai olmalı.