Java'da enum, java.lang.Enum'dan türetilen bir sınıf türüdür ve sınırlı sabit nesnelerin bir koleksiyonunu temsil eder, ancak yalnızca isimlerden oluşmakla sınırlı değildir: enum'lar yöntemler, alanlar, yapıcılar ile genişletilebilir, arayüzler uygulanabilir ve davranış eklenebilir.
Örnek:
enum Day { MONDAY("Hafta içi"), SATURDAY("Tatilde"); private String description; Day(String description) { this.description = description; } public String getDescription() { return description; } } Day d = Day.SATURDAY; System.out.println(d.getDescription()); // "Tatilde"
İncelikler:
Soru: "Enum'da bazı enum değerleri için yöntemler geçersiz kılınabilir mi? Eğer evet ise - nasıl?"
Yanlış Düşünülen: Tüm değerlerin davranışlarının her zaman aynı olduğu yanlış bir varsayımdır.
Doğru cevap: Evet, belirli sabitler için özel uygulamalar mümkündür.
Örnek:
enum Operation { PLUS { double apply(double x, double y) { return x + y; } }, MINUS { double apply(double x, double y) { return x - y; } }; abstract double apply(double x, double y); }
Hikaye
Bir sürücü kaydı sisteminde enum'larla durumları sakladılar, API kodu için ek bir alan uygulamadılar - geliştiriciler enum'u miras alarak genişletmeye çalıştılar, ama bu yasaktı. Sonuçta durumların saklama modelini yeniden yapmak zorunda kaldılar.
Hikaye
Bir internet mağazasında programcılar, testler için sahte bir örnek oluşturmak amacıyla özel yapıcıya yansıtma aracı ile erişmeye çalıştılar, ancak yeni örnekler oluşturma yasağı nedeniyle Exception aldılar: enum, yeni örnekler yaratmaktan korunmuştur. CI geçmedi, testler başarısız oldu.
Hikaye
Bir eski projede enum değerleri equals() ile karşılaştırıldı, == ile değil. Beklenmedik bir şekilde, serileştirme sırasında sorunlar ortaya çıktı: enum değerleri her zaman == ile karşılaştırılır, çünkü bunlar singleton'dır.