ProgramlamaBackend Geliştirici

Kotlin'daki veri sınıfları (data classes), normal sınıflar ve kalıtlama (inheritance) ile sınıflar arasındaki farkları açıklar mısınız? Hangi durumlarda veri sınıfı kullanmalıyız ve derleyici hangi kısıtlamaları getiriyor?

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

Cevap

Kotlin'de data class, verileri saklamak için tasarlanmıştır. Derleyici, equals(), hashCode(), toString() metodlarını otomatik olarak üretir, ayrıca copy() ve componentN() fonksiyonları, bu tür nesnelerle çalışmaya büyük ölçüde yardımcı olur:

data class User(val name: String, val age: Int) val u1 = User("Ivan", 30) val u2 = u1.copy(age = 31)

Normal sınıfların böyle otomatik olarak üretilmiş metodları yoktur; her şey manuel olarak yazılır. Veri sınıflarını DTO'lar, modeller ve veri yapıları için kullanmak daha iyidir.

Veri sınıflarının kısıtlamaları:

  • Ana yapıcı (primary constructor) en az bir parametre içermelidir.
  • Tüm yapıcı parametreleri val veya var ile etiketlenmelidir.
  • Veri sınıfı abstract, open, sealed veya inner olamaz.
  • Veri sınıfını iş mantığı veya kalıtım hiyerarşisi olan sınıflar için kullanmak önerilmez.

Kandırmaca Soru

"Bir veri sınıfını diğer bir veri sınıfından kalıtım (inheritance) yoluyla ilan edebilir miyiz? Neden (veya neden olamaz)?"

Hayır, bir veri sınıfı doğrudan başka bir veri sınıfından kalıtım alamaz. Veri sınıfı yalnızca bir arayüzden veya normal bir sınıftan (veri sınıfı olmayan) kalıtım alabilir. Bu, otomatik olarak üretilen metodlarla karışıklığı önlemek içindir (örneğin, kalıtılan özelliklerin kopyalanması belirsizdir).

data class Base(val id: Int) data class Child(val name: String) : Base(1) // Derleme hatası: izin verilmedi

Bu konunun inceliklerini bilmemek nedeniyle gerçek hata örnekleri


Hikaye

Bir bankacılık projesinde, iş mantığı ve kalıtım ile veri sınıfı kullanıldı. Yeni bir alan eklendikten sonra, nesneleri doğru bir şekilde kopyalamak mümkün olmadı, bir kısmı iş mantığı kayboldu (metodlar miras alınmamıştı) ve bu, komisyon hesaplamalarında hatalara yol açtı.


Hikaye

Bir e-ticaret platformunda veri sınıfı, kullanıcının sepet durumunu saklamak için kullanıldı. copy() ile durum güncellendikten sonra, iç listelerin derinlemesine kopyalanmadığını unuttular. Bu nedenle, kullanıcılar arasında "veri sızıntısı" meydana geldi.


Hikaye

Bir dış API entegrasyonu projesinde, veri sınıfının JSON'a serileştirilmesi özel görünürlüğe sahip alanların ortaya çıkmasına yol açtı, bu da API sözleşmesini ihlal etti ve istemci tarafında hatalara neden oldu.