Menu
Coddy logo textTech

Private Setter

Teil des Abschnitts Objektorientierte Programmierung der Kotlin-Journey von Coddy. Lektion 9 von 57.

Oft soll Code außerhalb einer Klasse eine Eigenschaft lesen, sie aber nicht ändern. private set hält den Getter öffentlich und macht nur den Setter privat:

class Counter {
    var count = 0
        private set

    fun increment() {
        count++
    }
}

Innerhalb von main:

val c = Counter()
c.increment()
println(c.count)
// c.count = 99   // Fehler: der Setter ist privat

Ausgabe:

1

Dies eignet sich für Werte, die sich nur durch eine Regel ändern dürfen, etwa eine Punktzahl, die nur durch gültige Vergaben steigt:

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

Innerhalb von main:

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

Ausgabe:

13
[10, 3]

Die obige history zeigt ein gängiges Muster: eine private MutableList innerhalb der Klasse, die als schreibgeschützte List bereitgestellt wird. Aufrufer können die Elemente lesen, verfügen aber über kein add oder remove, um sie zu ändern:

private val _items = mutableListOf<String>()
val items: List<String> get() = _items      // schreibgeschützte Ansicht
// außerhalb: items.add("x")                  // Fehler: List hat kein add

Ein val ändert sich nach der Erstellung nie, nicht einmal innerhalb der Klasse. Ein var mit private set bleibt nur innerhalb der Klasse veränderbar. Wähle val für Werte, die während der gesamten Lebensdauer des Objekts unverändert bleiben:

class Order(val id: Int) {            // ändert sich nie
    var status = "new"
        private set                       // ändert sich, aber nur innerhalb von Order
    fun ship() { status = "shipped" }
}
challenge icon

Aufgabe

Einfach

Vervollständige die Klasse Elevator(val topFloor: Int). floor und trips können von außerhalb gelesen, aber nur innerhalb der Klasse geändert werden (private set). goTo(target) bewegt sich zwischen Etage 0 und topFloor: Eine gültige Bewegung zu einer anderen Etage aktualisiert floor, addiert 1 zu trips und gibt true zurück; eine ungültige Bewegung oder eine Bewegung auf dieselbe Etage gibt false zurück.

Der bereitgestellte Code liest die oberste Etage und anschließend die Zielstockwerke ein. Nach einer Bewegung gibt er floor 3 aus oder stay 3, wenn die Bewegung abgelehnt wurde, und schließlich trips: mit der Anzahl.

Dein Code gehört in Elevator.kt. Main.kt enthält den bereitgestellten Ein-/Ausgabecode und kann nicht bearbeitet werden.

Probier es selbst

fun main() {
    // Bereitgestellter Ein-/Ausgabecode: belasse ihn wie er ist
    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 iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung

Übe selbstständig: Kotlin-Playground