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 privatAusgabe:
1Dies 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 addEin 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" }
}Aufgabe
EinfachVervollstä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}")
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1Klassen und Objekte
Arbeiten mit DateienKlassen definierenPrimärkonstruktoreninit-Blöcke und ValidierungSekundärkonstruktorenRückblick – Bibliotheksausweis4Vererbung
Offene Klassen und UnterklassenÜberschreiben von Membernsuper und KonstruktorenAbstrakte KlassenRückblick – Mitarbeiterverzeichnis2Eigenschaften und Kapselung
Benutzerdefinierte ZugriffsmethodenSichtbarkeitsmodifikatorenPrivate Setterlazy und lateinitWiederholung – Bankkonto5Schnittstellen
Schnittstellen deklarierenStandardmethodenMehrere SchnittstellenSchnittstellen als TypenRückblick – Zahlungsmethoden8Generics
Generische FunktionenGenerische KlassenTypbeschränkungenVarianz mit in und outRückblick – Prioritätswarteschlange11Projekt: Bibliotheksverwaltung
Bücher und MitgliederBücher ausleihenÜbe selbstständig: Kotlin-Playground