Accessor Kustom
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Kotlin di Coddy. Pelajaran 7 dari 57.
Setiap property Kotlin memiliki getter, dan setiap var juga memiliki setter. Secara default, keduanya membaca dan menulis nilai yang tersimpan. Getter kustom menghitung nilai setiap kali dibaca:
class Rectangle(var width: Int, var height: Int) {
val area: Int
get() = width * height
}Di dalam main:
val r = Rectangle(3, 4)
println(r.area)
r.width = 10
println(r.area)Output:
12
40Setter kustom menjalankan kode setiap kali property diberi nilai. Di dalamnya, value adalah nilai yang diberikan dan field adalah nilai yang disimpan di balik property, yaitu backing field:
class Thermostat {
var target = 20
set(value) {
field = value.coerceIn(10, 30)
}
}Di dalam main:
val t = Thermostat()
t.target = 42
println(t.target)
t.target = 18
println(t.target)Output:
30
18Di dalam accessor, gunakan field, bukan nama property: menulis target = value di dalam setter target akan memanggil setter lagi, tanpa henti:
var target = 20
set(value) {
// target = value // memanggil setter ini lagi: rekursi tak terbatas
field = value // menyimpan nilai
}Setter juga menjadi tempat untuk merespons perubahan, misalnya dengan menghitung atau mencatatnya:
class Player(name: String) {
var changes = 0
private set
var name = name
set(value) {
field = value.trim()
changes++
}
}Di dalam main:
val p = Player("ada")
p.name = " Ada "
p.name = "Ada L."
println("${p.name} after ${p.changes} changes")Output:
Ada L. after 2 changesTantangan
MudahLengkapi class Circle(radius: Double). radius adalah var yang setter-nya menyimpan nilai negatif sebagai 0. Tambahkan property hanya-baca diameter dan area (π r² dengan Math.PI) dengan getter khusus, serta label, yang mengembalikan r=2.0 d=4.0 a=12.57 dengan area dibulatkan hingga dua angka desimal ("%.2f".format(area)).
Kode yang disediakan membaca satu radius per baris, mencetak label, lalu menggandakan radius lingkaran terakhir dan mencetak label lagi, jadi nilainya harus mengikuti radius.
Tulis kodemu di Circle.kt. Main.kt berisi kode input/output yang disediakan dan tidak boleh diedit.
Coba sendiri
fun main() {
// Kode input/output yang disediakan: biarkan apa adanya
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)
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1class dan object
Bekerja dengan fileMendefinisikan classKonstruktor utamaBlok init dan validasiKonstruktor sekunderRingkasan: Kartu Perpustakaan2property dan Enkapsulasi
Accessor KustomModifier VisibilitasSetter Privatlazy dan lateinitRingkasan: Rekening Bank5Interface
Mendeklarasikan Interfacemethod DefaultBeberapa InterfaceInterface sebagai TipeUlasan: Metode Pembayaran11Proyek: Pengelolaan Perpustakaan
Buku dan AnggotaPeminjaman BukuLatihan sendiri: Playground Kotlin