ProgramlamaKotlin geliştirici

Kotlin'deki enum sınıflarının mekanizmasını açıklayın: enum class nedir, Java'dan ne farkı vardır, enum'un özellikleri ve kısıtlamaları nelerdir, nasıl kendi işlevselliğinizi ekleyebilirsiniz, serileştirme ve karşılaştırma ile ilgili hangi nüanslar ortaya çıkabilir. Bir örnek verin.

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

Cevap.

Kotlin'de enumerasyonlar (enum class), sınırlı bir değer kümesi tanımlamak ve bunu metodlar ve özelliklerle genişletmek için izin verir.

Temel Noktalar:

  • Enum sınıfı, Java'ya benzer şekilde tanımlanır, ancak sözdizimi daha katıdır:
    enum class Direction { NORTH, SOUTH, WEST, EAST }
  • Enum öğeleri, ilgili sınıfın örnekleridir.
  • Enum içinde ek özellikler ve metodlar tanımlanabilir:
    enum class Color(val rgb: Int) { RED(0xFF0000), GREEN(0x00FF00), BLUE(0x0000FF); fun containsRed() = (rgb and 0xFF0000 != 0) }
  • Her bir değere, adıyla (Color.RED.name), indeksle (ordinal) erişilebilir ve values() ile tam liste elde edilebilir.
  • Kotlin'de enum sınıfları miras alınamaz, ancak arayüzler uygulanabilir.
  • Java'dan farkı — sınıflar açıkça enum'dan miras alınamaz, iç içe diziler kullanılamaz.
  • Kotlin'de enum varsayılan olarak standart araçlarla (örneğin, Gson veya Jackson) serileştirilmez — özel adaptörler/annotasyonlar gereklidir.

Enum Karşılaştırması:

  • Enum'lar == (kimlik) ile karşılaştırılır, çünkü öğeler benzersizdir.
  • Serileştirme sırasında isimler değişebilir, bu yüzden değerleri açıkça belirlemek daha iyidir (storage value pattern).

Kandırmaca Sorusu.

Kotlin'de enum sınıfında, Java'da olduğu gibi her öğenin onu yeniden tanımlaması için bir soyut metod tanımlanabilir mi?

Doğru Cevap: Evet, enum tarzında bir soyut metod tanımlanabilir ve her öğe kendi uygulamasını sağlamak zorundadır!

enum class State { START { override fun next() = RUNNING }, RUNNING { override fun next() = STOPPED }, STOPPED { override fun next() = STOPPED }; abstract fun next(): State }

Konuyla ilgili bilinmemesi nedeniyle gerçek hata örnekleri.


Hikaye

Java'dan Kotlin'e geçişte ekip, yeni enum sınıfını normal bir sınıf gibi miras almaya çalıştı — anlaşılmıştır ki enum miras alınamaz, bu da mimariyi bozmuştur. Durum makinelerinin modülerliğine tamamen yeni bir yaklaşım geliştirmek zorunda kaldılar.


Hikaye

Veritabanında değer depolamak için elemanın adını (enum.name) aldılar, ancak refaktörizasyonda enum öğeleri yeniden adlandırıldı — veritabanındaki veriler yeni mantığa uymadı ve tutarsızlık meydana geldi (storage value pattern uygulanmadı).


Hikaye

Gson ile enum sınıfını serileştirirken özel TypeAdapter'ı bağlamayı unuttular. Üretimde hizmet düzensiz JSON değerleri vermeye başladı çünkü standart parser yanlış alanı (ordinal veya name) serileştiriyor ve deserialization mikros servisler arasında uyuşmuyordu.