Setters privados
Parte de la sección Programación orientada a objetos del Journey de Kotlin de Coddy. Lección 9 de 57.
A menudo, el código externo debería leer una propiedad, pero no cambiarla. private set mantiene público el getter y hace que solo el setter sea privado:
class Counter {
var count = 0
private set
fun increment() {
count++
}
}Dentro de main:
val c = Counter()
c.increment()
println(c.count)
// c.count = 99 // error: el setter es privadoSalida:
1Esto se aplica a valores que solo pueden cambiar mediante una regla, como una puntuación que solo aumenta mediante recompensas válidas:
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)
}
}Dentro de main:
val p = Player("Ada")
p.award(10)
p.award(-5)
p.award(3)
println(p.score)
println(p.history)Salida:
13
[10, 3]La history anterior muestra un patrón común: una MutableList privada dentro de la clase, expuesta como una List de solo lectura. Los llamadores pueden leer los elementos, pero no tienen add ni remove para modificarlos:
private val _items = mutableListOf<String>()
val items: List<String> get() = _items // vista de solo lectura
// fuera: items.add("x") // error: List no tiene addUn val nunca cambia después de su creación, ni siquiera dentro de la clase. Un var con private set sigue siendo modificable únicamente dentro de la clase. Elige val para los valores que permanecen fijos durante toda la vida del objeto:
class Order(val id: Int) { // nunca cambia
var status = "new"
private set // cambia, pero solo dentro de Order
fun ship() { status = "shipped" }
}Desafío
FácilCompleta la clase Elevator(val topFloor: Int). floor y trips se pueden leer desde fuera, pero solo se pueden cambiar dentro de la clase (private set). goTo(target) se desplaza entre el piso 0 y topFloor: un desplazamiento válido a un piso diferente actualiza floor, suma 1 a trips y devuelve true; un desplazamiento no válido o al mismo piso devuelve false.
El código proporcionado lee el piso superior y después los pisos de destino. Imprime floor 3 después de un desplazamiento o stay 3 cuando se rechazó el desplazamiento, y finalmente imprime trips: con el recuento.
Tu código va en Elevator.kt. Main.kt contiene el código proporcionado de entrada/salida y no se puede editar.
Pruébalo tú mismo
fun main() {
// Código de entrada/salida suministrado: déjalo como está
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}")
}
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Programación orientada a objetos
1Clases y objetos
Trabajar con archivosDefinir clasesConstructores primariosBloques init y validaciónConstructores secundariosRepaso - Tarjeta de biblioteca4Herencia
Clases abiertas y subclasesSobrescritura de miembrossuper y constructoresClases abstractasRepaso: directorio del personal2Propiedades y encapsulación
Accesores personalizadosModificadores de visibilidadSetters privadoslazy y lateinitRepaso: cuenta bancaria5Interfaces
Declaración de interfacesMétodos predeterminadosInterfaces múltiplesInterfaces como tiposRepaso: métodos de pago8Genéricos
Funciones genéricasClases genéricasRestricciones de tiposVariancia con in y outRepaso - Cola de prioridad11Proyecto: Gestión de biblioteca
Libros y miembrosPréstamo de librosPractica por tu cuenta: Playground de Kotlin