Mengapa konstruktor enum tidak dapat mengakses bidang dan metode statis? Ini benar-benar valid dengan kelas, tetapi tidak diperbolehkan dengan enum.
Apa yang saya coba lakukan adalah menyimpan contoh enum saya di Peta statis. Pertimbangkan kode contoh ini yang memungkinkan pencarian dengan singkatan:
public enum Day {
Sunday("Sun"), Monday("Mon"), Tuesday("Tue"), Wednesday("Wed"), Thursday("Thu"), Friday("Fri"), Saturday("Sat");
private final String abbreviation;
private static final Map<String, Day> ABBREV_MAP = new HashMap<String, Day>();
private Day(String abbreviation) {
this.abbreviation = abbreviation;
ABBREV_MAP.put(abbreviation, this); // Not valid
}
public String getAbbreviation() {
return abbreviation;
}
public static Day getByAbbreviation(String abbreviation) {
return ABBREV_MAP.get(abbreviation);
}
}
Ini tidak akan berfungsi karena enum tidak mengizinkan referensi statis dalam konstruktornya. Namun itu berfungsi hanya menemukan jika diimplementasikan sebagai kelas:
public static final Day SUNDAY = new Day("Sunday", "Sun");
private Day(String name, String abbreviation) {
this.name = name;
this.abbreviation = abbreviation;
ABBREV_MAP.put(abbreviation, this); // Valid
}
final
). Tebak itu akan sulit ditangkap!EnumSet.allOf
bukanEnum.values()
? Saya bertanya karenavalues
ini semacam metode hantu (tidak dapat melihat sumbernyaEnum.class
) dan saya tidak tahu kapan dibuatEnum.values()
lebih cepat jika Anda berencana untuk mengulanginya dengan loop for yang ditingkatkan (karena mengembalikan array), tetapi sebagian besar tentang gaya dan kasus penggunaan. Mungkin lebih baik digunakanEnumSet.allOf()
jika Anda ingin menulis kode yang ada di dokumentasi Java daripada hanya di spesifikasinya, tetapi banyak orang yang tampaknya sudah terbiasaEnum.values()
.Kutipan dari JLS, bagian "Enum Body Declarations" :
sumber
mungkin ini yang kamu inginkan
sumber
Collections.unmodifiableMap()
adalah praktik yang sangat bagus di sini. +1Masalah diselesaikan melalui kelas bersarang. Kelebihan: lebih pendek dan juga lebih baik dengan konsumsi CPU. Kekurangan: satu kelas lagi dalam memori JVM.
sumber
Saat kelas dimuat di JVM, bidang statis diinisialisasi sesuai urutan kemunculannya dalam kode. Misalnya
Outputnya akan menjadi 0. Perhatikan bahwa inisialisasi test4 terjadi dalam proses inisialisasi statis dan selama waktu ini j belum diinisialisasi seperti yang muncul nanti. Sekarang jika kita mengganti urutan penginisialisasi statis sehingga j muncul sebelum test4. Outputnya adalah 6. Tetapi dalam kasus Enums, kita tidak dapat mengubah urutan bidang statis. Hal pertama dalam enum haruslah konstanta yang sebenarnya merupakan instance akhir statis dari jenis enum. Jadi, untuk enum, selalu dijamin bahwa bidang statis tidak akan diinisialisasi sebelum konstanta enum. Karena kita tidak dapat memberikan nilai yang masuk akal ke bidang statis untuk digunakan dalam konstruktor enum , tidak ada artinya mengaksesnya dalam konstruktor enum.
sumber