Menu
Coddy logo textTech

Eşlikçi Nesneler

Coddy'nin Kotlin Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 13 / 57.

Bazı üyeler tek bir örneğe değil, bir bütün olarak sınıfa aittir. Kotlin bunları sınıfın içindeki bir companion object içine yerleştirir ve onlara sınıf adı üzerinden erişirsiniz:

class Temperature(val celsius: Double) {
    companion object {
        fun fromFahrenheit(f: Double) = Temperature((f - 32) * 5 / 9)
    }
}

main içinde:

val boiling = Temperature.fromFahrenheit(212.0)
println(boiling.celsius)

Çıktı:

100.0

fromFahrenheit bir fabrika fonksiyonudur: örnekler oluşturan bir fonksiyon. Bir oluşturucudan farklı olarak açıklayıcı bir adı vardır ve bir nesne yerine null döndürebilir. private constructor ile fabrikaya girişin tek yolu budur; böylece önce girdiyi kontrol edip temizleyebilir:

class Username private constructor(val text: String) {
    companion object {
        fun of(raw: String): Username? {
            val clean = raw.trim().lowercase()
            return if (clean.length in 3..12) Username(clean) else null
        }
    }
}

main içinde:

println(Username.of("  Ada_L ")?.text)
println(Username.of("x")?.text)
// Username("x")   // hata: kurucu private

Çıktı:

ada_l
null

Yardımcı nesne sınıfa aittir; bu nedenle private kurucuyu çağırabilir ve sınıfın kendi kodu, yardımcı nesnenin üyelerini bir önek olmadan kullanır. Burada her bilet, tüm biletlerin paylaştığı tek bir sayaçtan sıradaki numarayı alır:

class Ticket(val holder: String) {
    val number = nextNumber++

    companion object {
        private var nextNumber = 1
        val issued: Int
            get() = nextNumber - 1
    }
}

main içinde:

val a = Ticket("Ada")
val b = Ticket("Bo")
println("${a.holder} #${a.number}, ${b.holder} #${b.number}")
println("issued: ${Ticket.issued}")

Çıktı:

Ada #1, Bo #2
issued: 2

Kotlin'de static anahtar sözcüğü yoktur. Companion'ın üyeleri bu rolü üstlenir: tüm sınıf için tek bir kopya vardır ve bu kopyaya ClassName.member olarak erişilir. Her nesne gibi companion da sınıf ilk kez kullanıldığında bir kez oluşturulur. Fabrikalar ve paylaşılan sayaçlar gibi tek bir örneğe bağlı olmayan şeyleri onun içine koyun; bir örneğin verilerini okuyan her şey ise normal bir üye olarak kalmalıdır.

class User private constructor(val name: String) {
    fun greet() = "hi $name"             // bir örnek gerektirir: user.greet()

    companion object {
        fun guest() = User("guest")      // sınıfa aittir: User.guest()
    }
}
challenge icon

Görev

Kolay

Coupon sınıfını tamamla. Yapıcısı özeldir; bu nedenle kuponlar, companion object içindeki Coupon.create(code, percent) fabrikası tarafından oluşturulur. Kod 4 ila 10 karakter uzunluğunda büyük harflerden ve rakamlardan oluşmadıkça veya yüzde 1 ile 90 arasında olmadıkça null döndürür. Companion object ayrıca oluşturduğu kuponları created içinde sayar; dışarıdaki kod bu değeri okuyabilir ancak değiştiremez. apply(price), fiyatı indirim miktarı çıkarılmış ve aşağı yuvarlanmış olarak döndürür (price * (100 - percent) / 100).

Sağlanan kod, SAVE10 10 200 satırlarını (kod, yüzde, fiyat) okur. SAVE10: 180 veya invalid coupon SAVE10 yazdırır ve son olarak sayıyla birlikte created: yazdırır.

Kodun Coupon.kt dosyasına yazılmalıdır. Main.kt, sağlanan girdi/çıktı kodunu içerir ve düzenlenemez.

Kendin dene

fun main() {
    // Sağlanan girdi/çıktı kodu: olduğu gibi bırakın
    val input = generateSequence(::readLine).toList()
    for (line in input) {
        val (code, percent, price) = line.split(" ")
        val coupon = Coupon.create(code, percent.toInt())
        if (coupon == null) println("invalid coupon $code") else println("${coupon.code}: ${coupon.apply(price.toInt())}")
    }
    println("created: ${Coupon.created}")
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Kotlin playground