Menu
Coddy logo textTech

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 privado

Salida:

1

Esto 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 add

Un 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" }
}
challenge icon

Desafío

Fácil

Completa 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}")
}
quiz iconPonte a prueba

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

Practica por tu cuenta: Playground de Kotlin