Özel Erişimciler
Coddy'nin Kotlin Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 7 / 57.
Her Kotlin özelliğinin bir getter'ı, her var'ın da bir setter'ı vardır. Varsayılan olarak bunlar depolanmış bir değeri okur ve yazar. Özel bir getter ise her okumada değeri yeniden hesaplar:
class Rectangle(var width: Int, var height: Int) {
val area: Int
get() = width * height
}main içinde:
val r = Rectangle(3, 4)
println(r.area)
r.width = 10
println(r.area)Çıktı:
12
40Özel bir setter, özellik her atandığında kodu çalıştırır. İçinde value atanan değerdir ve field özelliğin arkasında depolanan değerdir; backing field:
class Thermostat {
var target = 20
set(value) {
field = value.coerceIn(10, 30)
}
}main içinde:
val t = Thermostat()
t.target = 42
println(t.target)
t.target = 18
println(t.target)Çıktı:
30
18Bir erişimci içinde özellik adını değil, field kullanın: target özelliğinin ayarlayıcısı içinde target = value yazmak, ayarlayıcıyı tekrar çağırarak sonsuza kadar devam eder:
var target = 20
set(value) {
// target = value // bu setter'ı tekrar çağırır: sonsuz özyineleme
field = value // değeri saklar
}Bir setter, değişikliklere tepki vermek için de kullanılabilir; örneğin bunları saymak veya günlüğe kaydetmek için:
class Player(name: String) {
var changes = 0
private set
var name = name
set(value) {
field = value.trim()
changes++
}
}main içinde:
val p = Player("ada")
p.name = " Ada "
p.name = "Ada L."
println("${p.name} after ${p.changes} changes")Çıktı:
Ada L. after 2 changesGörev
KolayCircle(radius: Double) sınıfını tamamla. radius, setter'ı negatif değerleri 0 olarak saklayan bir var'dır. Özel getter'lara sahip salt okunur diameter ve area özelliklerini (π r², Math.PI ile) ve alanı iki ondalık basamağa yuvarlanmış olarak r=2.0 d=4.0 a=12.57 döndüren label özelliğini ekle ("%.2f".format(area)).
Sağlanan kod her satırdan bir yarıçap okur, label'ı yazdırır, ardından son dairenin yarıçapını iki katına çıkarır ve label'ı tekrar yazdırır; bu nedenle değerler yarıçapı takip etmelidir.
Kodun Circle.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()
var last = Circle(0.0)
for (line in input) {
last = Circle(line.toDouble())
println(last.label)
}
last.radius *= 2
println(last.label)
}
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