Menu
CoddyTech

Setter Privat

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Kotlin di Coddy. Pelajaran 9 dari 57.

Sering kali, kode di luar sebaiknya hanya membaca property, bukan mengubahnya. private set membuat getter tetap publik dan hanya setter yang bersifat privat:

class Counter {
    var count = 0
        private set

    fun increment() {
        count++
    }
}

Di dalam main:

val c = Counter()
c.increment()
println(c.count)
// c.count = 99   // error: setter bersifat private

Output:

1

Cara ini cocok untuk nilai yang hanya boleh berubah melalui sebuah aturan, seperti skor yang hanya bertambah melalui penghargaan yang valid:

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)
    }
}

Di dalam main:

val p = Player("Ada")
p.award(10)
p.award(-5)
p.award(3)
println(p.score)
println(p.history)

Output:

13
[10, 3]

history di atas menunjukkan pola umum: MutableList privat di dalam class, yang ditampilkan sebagai List hanya-baca. Pemanggil dapat membaca item, tetapi tidak memiliki add atau remove untuk mengubahnya:

private val _items = mutableListOf<String>()
val items: List<String> get() = _items      // tampilan hanya-baca
// di luar: items.add("x")                  // error: List tidak memiliki add

val tidak pernah berubah setelah dibuat, bahkan di dalam class. var dengan private set tetap bisa diubah hanya di dalam class. Pilih val untuk nilai yang tetap sepanjang masa hidup object:

class Order(val id: Int) {            // tidak pernah berubah
    var status = "new"
        private set                       // berubah, tetapi hanya di dalam Order
    fun ship() { status = "shipped" }
}
challenge icon

Tantangan

Mudah

Lengkapi class Elevator(val topFloor: Int). floor dan trips dapat dibaca dari luar, tetapi hanya dapat diubah di dalam class (private set). goTo(target) berpindah antara lantai 0 dan topFloor: perpindahan yang valid ke lantai berbeda akan memperbarui floor, menambahkan 1 ke trips, dan mengembalikan true; perpindahan yang tidak valid atau ke lantai yang sama akan mengembalikan false.

Code yang disediakan membaca lantai teratas, lalu lantai tujuan. Code tersebut mencetak floor 3 setelah perpindahan atau stay 3 jika perpindahan ditolak, lalu mencetak trips: beserta jumlahnya.

Letakkan kodemu di Elevator.kt. Main.kt berisi code input/output yang disediakan dan tidak dapat diedit.

Coba sendiri

fun main() {
    // Kode input/output yang disediakan: biarkan apa adanya
    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}")
}
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