Menu
Coddy logo textTech

Nesne İfadeleri

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

Bir nesne ifadesi, ihtiyaç duyulduğu yerde, adı olmayan bir sınıfın tek seferlik bir nesnesini oluşturur. object : Type { ... } şeklinde yazılır ve genellikle bir arayüzü uygular. Bir arayüz, nasıl çalıştıklarını belirtmeden yöntemleri listeler; 5. bölümde arayüzler ayrıntılı olarak ele alınır:

interface Greeter {
    fun greet(name: String): String
}

main içinde:

val polite = object : Greeter {
    override fun greet(name: String) = "Good morning, $name."
}
println(polite.greet("Ada"))

Çıktı:

Good morning, Ada.

Bir nesne bildirimi bir kez var olur. Bir nesne ifadesi, kodu her çalıştığında değerlendirilir ve her çalıştırma yeni bir nesne oluşturur. Çevresindeki yerel değişkenleri okuyabilir ve değiştirebilir:

interface Counter {
    fun next(): Int
}

fun counterFrom(start: Int): Counter {
    var current = start
    return object : Counter {
        override fun next() = current++
    }
}

main içinde:

val a = counterFrom(10)
val b = counterFrom(1)
println("${a.next()} ${a.next()} ${b.next()}")

Çıktı:

10 11 1

Yaygın bir kullanım, davranışı bir kütüphane işlevine vermektir. sortedWith, Comparator alır; bu, compare(a, b) yöntemi a önce geldiğinde negatif bir sayı, eşitlik durumunda sıfır ve diğer durumlarda pozitif bir sayı döndüren bir arayüzdür:

main içinde:

val words = listOf("kiwi", "fig", "banana", "apple")
val byLength = object : Comparator<String> {
    override fun compare(a: String, b: String) = a.length - b.length
}
println(words.sortedWith(byLength))

Çıktı:

[fig, kiwi, apple, banana]

Bir üst türü olmayan nesne ifadesi, birkaç değeri yerel bir nesnede gruplandırır; özellikleri aynı işlev içinde kullanılabilir. Bir arayüzün tek bir yöntemi olduğunda, lambda ifadesi genellikle bir nesne ifadesinden daha kısadır. Birden fazla yöntem veya saklanacak bir durum olduğunda nesne ifadeleri uygundur.

val size = object {
    val width = 3
    val height = 4
}
println(size.width * size.height)                    // 12

val byLength = Comparator<String> { a, b -> a.length - b.length }   // lambda formu
challenge icon

Görev

Kolay

Validator arabiriminin, bir hata mesajı döndüren veya metin doğrulamadan geçtiğinde null döndüren check(text) adlı bir yöntemi vardır. İşlevi rules(minLength), nesne ifadeleriyle oluşturulan üç doğrulayıcıyı şu sırayla döndürecek şekilde tamamlayın: metin en az minLength karakter içermeli (too short), bir rakam içermeli (needs a digit) ve boşluk içermemelidir (no spaces allowed).

Sağlanan kod, minimum uzunluğu ve ardından her satırda bir parola okur. ok yazdırır veya o parolanın tüm hata mesajlarını ; ile birleştirerek yazdırır.

Kodunuz Rules.kt ve Validator.kt dosyaları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()
    val checks = rules(input[0].toInt())
    for (password in input.drop(1)) {
        val problems = checks.mapNotNull { it.check(password) }
        println(if (problems.isEmpty()) "ok" else problems.joinToString("; "))
    }
}
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