Özel Setter'lar
Coddy'nin Kotlin Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 9 / 57.
Çoğu zaman kod dışındaki kod, bir özelliği okumalı ancak onu değiştirmemelidir. private set, getter'ı herkese açık tutar ve yalnızca setter'ı private yapar:
class Counter {
var count = 0
private set
fun increment() {
count++
}
}main içinde:
val c = Counter()
c.increment()
println(c.count)
// c.count = 99 // hata: setter privateÇıktı:
1Bu, yalnızca geçerli ödüller aracılığıyla artan bir puan gibi, yalnızca bir kural yoluyla değişebilen değerlere uygundur:
class Player(val name: String) {
var score = 0
private set
private val _history = mutableListOf<Int>()
val history: List<Int> get() = _history
fun award(points: Int) {
if (points <= 0) return
score += points
_history.add(points)
}
}main içinde:
val p = Player("Ada")
p.award(10)
p.award(-5)
p.award(3)
println(p.score)
println(p.history)Çıktı:
13
[10, 3]Yukarıdaki history, yaygın bir kalıbı gösterir: sınıf içinde özel bir MutableList bulunur ve salt okunur bir List olarak dışa sunulur. Çağıranlar öğeleri okuyabilir, ancak öğeleri değiştirmek için add veya remove kullanamaz:
private val _items = mutableListOf<String>()
val items: List<String> get() = _items // salt okunur görünüm
// dışarıda: items.add("x") // hata: List'in add'i yokBir val, sınıfın içinde bile oluşturulduktan sonra asla değişmez. private set içeren var ise yalnızca sınıfın içinde değiştirilebilir kalır. Nesnenin tüm ömrü boyunca sabit kalan değerler için val seçin:
class Order(val id: Int) { // asla değişmez
var status = "new"
private set // değişir, ama yalnızca Order içinde
fun ship() { status = "shipped" }
}Görev
KolayElevator(val topFloor: Int) sınıfını tamamla. floor ve trips dışarıdan okunabilir, ancak yalnızca sınıfın içinde değiştirilebilir (private set). goTo(target), 0 ile topFloor arasındaki katlar arasında hareket eder: farklı bir kata yapılan geçerli bir hareket floor değerini günceller, trips değerine 1 ekler ve true döndürür; geçersiz veya aynı kata yapılan bir hareket ise false döndürür.
Verilen kod, en üst katı ve ardından hedef katları okur. Bir hareketten sonra floor 3 yazdırır veya hareket reddedildiğinde stay 3 yazdırır ve son olarak sayaçla birlikte trips: yazdırır.
Kodun Elevator.kt dosyasına yazılmalıdır. Main.kt verilen giriş/çıkış 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 lift = Elevator(input[0].toInt())
for (line in input.drop(1)) {
val moved = lift.goTo(line.toInt())
println("${if (moved) "floor" else "stay"} ${lift.floor}")
}
println("trips: ${lift.trips}")
}
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ç AlmaKendi başına pratik yap: Kotlin playground