Menu
Coddy logo textTech

const ile Sabitler

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

const val bir derleme zamanı sabiti bildirir: program derlendiğinde sabitlenen bir değer. Bir dosyanın en üst düzeyinde ve bir object veya companion object içinde kullanılabilir; ayrıca yalnızca Int, Double ve Boolean gibi temel türler ile String için geçerlidir:

const val MAX_PLAYERS = 4

class Lobby {
    val players = mutableListOf<String>()

    fun canStart() = players.size in MIN_PLAYERS..MAX_PLAYERS

    companion object {
        const val MIN_PLAYERS = 2
    }
}

main içinde:

val lobby = Lobby()
lobby.players += listOf("ada", "bo")
println(lobby.canStart())
println("${Lobby.MIN_PLAYERS}-$MAX_PLAYERS players")

Çıktı:

true
2-4 players

Sabitler BÜYÜK_YILAN_DİZİMİ biçiminde adlandırılır. const, val'dan daha katıdır: değer herhangi bir kod çalıştırılmadan bilinmelidir; bu nedenle bir işlev çağrısına veya listeye izin verilmez. Bir nesnedeki val da paylaşımlıdır ve salt okunurdur; ayrıca herhangi bir değeri kabul eder:

const val GREETING = "Hello"                  // bir String literali
const val TIMEOUT_MS = 30 * 1000              // literallerden hesaplanmış
// const val START = System.nanoTime()        // hata: bir sabit değil
// const val DAYS = listOf("Mon", "Tue")      // hata: yalnızca temel türler ve String
object Defaults {
    val DAYS = listOf("Mon", "Tue")           // paylaşılan salt okunur bir val
}

Bir companion object ayrıca paylaşılan değiştirilebilir durumu da barındırabilir. Her örnek aynı özelliği okur ve değiştirir; bu da sayaçlar ve önbellekler için uygundur. Bu sınıf, her ad için tek bir örnek tutar; dolayısıyla iki kez istendiğinde aynı nesne döndürülür (===, iki referansın tek bir nesneye işaret edip etmediğini kontrol eder):

class Tile private constructor(val name: String) {
    companion object {
        private val cache = mutableMapOf<String, Tile>()
        val created: Int
            get() = cache.size

        fun of(name: String) = cache.getOrPut(name) { Tile(name) }
    }
}

main içinde:

val a = Tile.of("grass")
val b = Tile.of("grass")
Tile.of("water")
println(a === b)
println(Tile.created)

Çıktı:

true
2

Üst düzey mi, eşlikçi mi? Üst düzey bir sabit veya işlev kendi dosyasına aittir ve paketin her dosyasında yalın adıyla kullanılır. Bir sabit tek bir sınıfa ait olduğunda onu bir eşlikçiye koyun: çağıranlar değerin nereden geldiğini belirten Lobby.MIN_PLAYERS ifadesini yazar ve bir private const val o sınıfın içinde kalır.

// Limits.kt
const val MAX_UPLOAD_MB = 25                 // her yerde MAX_UPLOAD_MB olarak kullanılır

// Lobby.kt
class Lobby {
    companion object {
        const val MIN_PLAYERS = 2            // Lobby.MIN_PLAYERS olarak kullanılır
        private const val ROOM_PREFIX = "L-" // yalnızca Lobby içinde
    }
}
challenge icon

Görev

Kolay

Order(val item: String, val qty: Int) sınıfını tamamla. Companion object, MAX_QTY = 10 ve PREFIX = "ORD" sabitlerini, bir sonraki sipariş numarası için özel bir sayacı, salt okunur paylaşılan toplam totalItems'ı ve oluşturulan siparişlerin hesaplanan count değerini içerir. init bloğu, MAX_QTY sabitinden oluşturulan quantity must be 1-10 mesajıyla 1 ile MAX_QTY arasında bir miktar olmasını gerektirir; ardından siparişe ORD-001, ORD-002, ... biçiminde bir id verir ve miktarını totalItems'a ekler. label(), ORD-001 tea x2 değerini döndürür.

Verilen kod max per order: 10 çıktısını yazdırır, ardından tea 2 satırlarını okur ve etiketi veya hata mesajını yazdırır; son olarak orders: 2, items: 5 çıktısını verir. Reddedilen siparişler bir numara tüketmez.

Kodun Order.kt dosyasına yazılmalıdır. Main.kt verilen 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()
    println("max per order: ${Order.MAX_QTY}")
    for (line in input) {
        val (item, qty) = line.split(" ")
        try {
            println(Order(item, qty.toInt()).label())
        } catch (e: IllegalArgumentException) {
            println(e.message)
        }
    }
    println("orders: ${Order.count}, items: ${Order.totalItems}")
}
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