ProgramlamaJava Kıdemli Geliştirici

Java'da enum'lar nasıl çalışır, kullanımlarıyla ilgili ne gibi incelikler vardır ve neden enum sadece sabitlerden oluşan basit bir küme değildir?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap

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:

  • Enum, sabitlerin eşsizlik garantisini verir: örnekler singleton'dır.
  • Arayüzler uygulanabilir.
  • Her değerin kendi sınıfı vardır (değer başına yöntemler geçersiz kılınabilir).
  • Enum, kopyalama ve yansıtma yoluyla yeni örneklerin oluşturulmasına karşı korunmuştur.

Karşıt Sorular

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); }

Bilgi Eksikliği Nedeniyle Gerçek Hatalara Örnekler


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.