Menu
CoddyTech

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
40

Setter 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
18

Di 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 changes
challenge icon

Tantangan

Mudah

Lengkapi 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)
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Playground Kotlin