Menu
Coddy logo textTech

Setter privati

Fa parte della sezione Programmazione orientata agli oggetti del percorso Kotlin di Coddy. Lezione 9 di 57.

Spesso il codice esterno dovrebbe leggere una proprietà, ma non modificarla. private set mantiene pubblico il getter e rende privato solo il setter:

class Counter {
    var count = 0
        private set

    fun increment() {
        count++
    }
}

All'interno di main:

val c = Counter()
c.increment()
println(c.count)
// c.count = 99   // errore: il setter è privato

Output:

1

È adatto ai valori che possono cambiare solo tramite una regola, come un punteggio che aumenta solo con assegnazioni valide:

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

All'interno di main:

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

Output:

13
[10, 3]

La history qui sopra mostra uno schema comune: una MutableList privata all'interno della classe, esposta come List di sola lettura. Chi chiama può leggere gli elementi, ma non dispone di add o remove per modificarli:

private val _items = mutableListOf<String>()
val items: List<String> get() = _items      // vista di sola lettura
// all'esterno: items.add("x")                  // errore: List non ha add

Un val non cambia mai dopo la creazione, nemmeno all'interno della classe. Un var con private set resta modificabile solo all'interno della classe. Scegli val per i valori fissi per tutta la durata di vita dell'oggetto:

class Order(val id: Int) {            // non cambia mai
    var status = "new"
        private set                       // cambia, ma solo all'interno di Order
    fun ship() { status = "shipped" }
}
challenge icon

Sfida

Facile

Completa la classe Elevator(val topFloor: Int). È possibile leggere floor e trips dall'esterno, ma modificarli solo all'interno della classe (private set). goTo(target) si sposta tra il piano 0 e topFloor: uno spostamento valido verso un piano diverso aggiorna floor, aggiunge 1 a trips e restituisce true; uno spostamento non valido o verso lo stesso piano restituisce false.

Il codice fornito legge il piano più alto e poi i piani di destinazione. Stampa floor 3 dopo uno spostamento oppure stay 3 quando lo spostamento viene rifiutato, e infine trips: seguito dal conteggio.

Il tuo codice va inserito in Elevator.kt. Main.kt contiene il codice fornito per l'input/output e non può essere modificato.

Provalo tu

fun main() {
    // Codice di input/output fornito: lascialo così com'è
    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 iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Playground Kotlin