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 playersSabitler 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
}
}Görev
KolayOrder(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}")
}
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
1Sınıflar ve Nesneler
Dosyalarla ÇalışmaSınıfları TanımlamaBirincil Yapıcılarinit Blokları ve Doğrulamaİkincil YapıcılarTekrar - Kütüphane Kartı4Kalıtım
Açık Sınıflar ve Alt SınıflarÜyeleri Geçersiz Kılmasuper ve YapıcılarSoyut SınıflarTekrar - Personel Dizini2Özellikler ve Kapsülleme
Özel ErişimcilerGörünürlük DeğiştiricileriÖzel Setter'larlazy ve lateinitTekrar - Banka Hesabı5Arayüzler
Arayüz BildirimleriVarsayılan MetotlarBirden Çok ArayüzTür Olarak ArayüzlerÖzet - Ödeme Yöntemleri8Generic'ler
Generic FonksiyonlarGeneric SınıflarTür Kısıtlamalarıin ve out ile VaryansTekrar - Öncelik Kuyruğu11Proje: Kütüphane Yönetimi
Kitaplar ve ÜyelerKitap Ödünç Alma3Nesneler ve Eşlikçiler
Nesne BildirimleriEşlikçi Nesnelerconst ile SabitlerNesne İfadeleriTekrar - Bilet GişesiKendi başına pratik yap: Kotlin playground