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 è privatoOutput:
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 addUn 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" }
}Sfida
FacileCompleta 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}")
}
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
1Classi e oggetti
Lavorare con i fileDefinire le classiCostruttori primariBlocchi init e convalidaCostruttori secondariRiepilogo - Tessera della biblioteca4Ereditarietà
Classi aperte e sottoclassiRidefinizione dei membrisuper e costruttoriClassi astratteRiepilogo - Elenco del personale2Proprietà e incapsulamento
Accessor personalizzatiModificatori di visibilitàSetter privatilazy e lateinitRipasso - Conto bancario5Interfacce
Dichiarare le interfacceMetodi predefinitiInterfacce multipleLe interfacce come tipiRiepilogo - Metodi di pagamento8Tipi generici
Funzioni genericheClassi genericheVincoli sui tipiVarianza con in e outRiepilogo - Coda con priorità11Progetto: Gestione della biblioteca
Libri e sociPrendere in prestito i libriEsercitati da solo: Playground Kotlin