Jawaban:
Saya tidak tahu apa yang ingin Anda lakukan, tetapi ini adalah cara saya menerjemahkan kode contoh Anda ....
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;
}
}
Atau, Anda dapat membuat metode pengambil untuk text
.
Sekarang Anda bisa melakukannya Strings.STRING_ONE.toString();
final
akan lebih baik.
new
konstruktor private
. Pada dasarnya, pembuatan objek dilarang dan final
tidak benar-benar diperlukan dalam kasus ini.
setText(String)
pada enum dan itu dapat melepaskan neraka :) final
jenis dokumen maksud Anda bahwa itu adalah konstan dengan dukungan kompiler. Jika Anda menggunakan String
konstanta, Anda tidak akan menyatakannya public static String
, bukan?
Nilai String Khusus untuk Enum
dari http://javahowto.blogspot.com/2006/10/custom-string-values-for-enum.html
Nilai string default untuk java enum adalah nilai nominalnya, atau nama elemen. Namun, Anda dapat menyesuaikan nilai string dengan menimpa metode toString (). Sebagai contoh,
public enum MyType {
ONE {
public String toString() {
return "this is one";
}
},
TWO {
public String toString() {
return "this is two";
}
}
}
Menjalankan kode tes berikut akan menghasilkan ini:
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
direktori: EnumTest $ MyType.class EnumTest $ MyType $ 1.class EnumTest $ MyType $ 2.class yang akan bertambah sangat cepat. Terbaik untuk melakukannya sebagai jawaban yang diharapkan, dengan memberikan nilai pada konstruktor enum. Saya sebenarnya tidak setuju dengan penggantian toString()
; Saya percaya lebih baik menggunakan pengambil yang eksplisit seperti getKey()
karena mengganti toString()
mungkin tidak terduga oleh pengguna enum lainnya.
Gunakan name()
metodenya:
public class Main {
public static void main(String[] args) throws Exception {
System.out.println(Strings.ONE.name());
}
}
enum Strings {
ONE, TWO, THREE
}
hasil panen ONE
.
Strings.STRING_ONE.name()
menghasilkan "STRING_ONE", bukan "ONE". Ini bukan jawaban yang bagus. Anda tidak dapat memiliki String yang tidak akan menjadi pengidentifikasi Java yang valid, dll.
name()
dapat dipengaruhi oleh program obfuscator. Saya mengalami masalah yang sama beberapa waktu lalu. Misalnya, dengan Proguard Anda harus mengatasi ini. Lihat Memproses Kelas Enumerasi
Entah nama enum sama dengan string yang Anda inginkan atau, secara umum, Anda bisa mengaitkan atribut arbitrer dengan nilai enum Anda:
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.
}
Sangat penting untuk memiliki konstanta di bagian atas, dan metode / atribut di bagian bawah.
Bergantung pada apa yang Anda maksud dengan "gunakan mereka sebagai String", Anda mungkin tidak ingin menggunakan enum di sini. Dalam kebanyakan kasus, solusi yang diusulkan oleh Elite Gentleman akan memungkinkan Anda untuk menggunakannya melalui metode toString mereka, misalnya dalam System.out.println(STRING_ONE)
atau String s = "Hello "+STRING_TWO
, tetapi ketika Anda benar-benar membutuhkan String (mis. STRING_ONE.toLowerCase()
), Anda mungkin lebih suka mendefinisikannya sebagai konstanta:
public interface Strings{
public static final String STRING_ONE = "ONE";
public static final String STRING_TWO = "TWO";
}
toLowerCase()
solusi saya, mereka bisa pergi Strings.STRING_TWO.toString().toLowerCase()
.
interface
di tempat final
kelas dengan private
konstruktor. Ini adalah praktik yang tidak dianjurkan.
Anda dapat menggunakannya untuk string 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;
}
}
Dan panggilan dari metode utama
public class Test {
public static void main (String args[]){
System.out.println(EnumTest.NAME_ONE.getName());
System.out.println(EnumTest.NAME_TWO.getName());
}
}
Jika Anda tidak ingin menggunakan konstruktor , dan Anda ingin memiliki nama khusus untuk metode ini, coba ini:
public enum MyType {
ONE {
public String getDescription() {
return "this is one";
}
},
TWO {
public String getDescription() {
return "this is two";
}
};
public abstract String getDescription();
}
Saya menduga ini adalah solusi tercepat . Tidak perlu menggunakan variabel final .
private String text
harus final.