Type safety
- Kotlin kursu
- Orta seviye
- Ders 77/116
- 5 dk
value class ile type safety öğrenirsin.
Tür güvenliği
Value class'ın temel amacı tür güvenliğidir. UserId ve OrderId ikisi de String sarmalasa da farklı türlerdir. fun findUser(id: UserId) bildirimi, yanlışlıkla OrderId geçmeyi derleme hatası yapar.
Aynı String türünü her yerde kullanmak karışıklığa açıktır: bir fonksiyon hem kullanıcı hem sipariş numarası bekliyorsa hangisini verdiğinizi derleyici bilemez. Value class bu riski ortadan kaldırır. Çalışma zamanında ek bellek yok; yalnızca derleme zamanında denetim yapılır.
Çalışma zamanı temsili
Value class çalışma zamanında kutulama olmadan temsil edilir. UserId("U1") aslında bellekte yalnızca String "U1" olarak saklanır; sarmalayıcı nesne oluşmaz. Bu, value class'ı sıfır ek yükle donatır.
Ancak value class bir Any'ye atandığında veya jenerik koleksiyona eklendiğinde kutulama oluşabilir. Bu nadir durumlarda value class yine de String göre daha az ek yüktür. Çoğu kullanımda value class, String kadar hızlıdır ama tür güvenliği sağlar.
Uygulama UserId ve OrderId ile tür güvenliği
@JvmInline value class UserId(val id: String) ve @JvmInline value class OrderId(val id: String) tanımla. fun findUser(id: UserId) = println("User: ${id.id}") yaz. main içinde findUser(UserId("U1")) çağır.
Başlangıç kodu
// UserId ve OrderId değer sınıflarını tanımla
// findUser(id: UserId) metodu yaz
fun main() {
// findUser'a UserId örneği gönder
}Örnek çözüm
@JvmInline
value class UserId(val id: String)
@JvmInline
value class OrderId(val id: String)
fun findUser(id: UserId) = println("User: ${id.id}")
fun main() {
findUser(UserId("U1"))
}Beklenen çıktı
User: U1
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 findUser imzasını tamamla
fun findUser(id: ____) { /* ... */ }
fun findUser(id: UserId) { /* ... */ }
Açıklama: findUser yalnızca UserId kabul eder.
2 tür güvenliği kavramlarını eşle
| Kavram | Anlamı |
|---|---|
UserId vs String |
Farklı türler |
no boxing |
Sıfır ek yük |
compile-time |
Derleme denetimi |
runtime |
Temel tür |
3 String yerine value class neden kullanılır?
- Daha hızlı çalışır
- Daha az kod yazılır
- Daha az bellek kullanır
- Tür güvenliği sağlar Doğru cevap
Açıklama: value class tür karışıklığını derleme hatası yapar.