Menu
Coddy logo textTech

Setters Privados

Parte da seção Programação Orientada a Objetos do Journey de Kotlin da Coddy. Lição 9 de 57.

Frequentemente, o código externo deve ler uma propriedade, mas não alterá-la. private set mantém o getter público e torna apenas o setter 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   // erro: o setter é privado

Saída:

1

Isso se aplica a valores que só podem mudar por meio de uma regra, como uma pontuação que só aumenta por meio de 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)

Saída:

13
[10, 3]

O history acima mostra um padrão comum: uma MutableList privada dentro da classe, exposta como uma List somente para leitura. Os chamadores podem ler os itens, mas não têm add nem remove para alterá-los:

private val _items = mutableListOf<String>()
val items: List<String> get() = _items      // visão somente leitura
// fora: items.add("x")                  // erro: List não tem add

Um val nunca muda após a criação, nem mesmo dentro da classe. Um var com private set permanece modificável apenas dentro da classe. Escolha val para valores que permanecem fixos durante toda a vida do objeto:

class Order(val id: Int) {            // nunca muda
    var status = "new"
        private set                       // muda, mas apenas dentro de Order
    fun ship() { status = "shipped" }
}
challenge icon

Desafio

Fácil

Complete a classe Elevator(val topFloor: Int). floor e trips podem ser lidos externamente, mas só podem ser alterados dentro da classe (private set). goTo(target) move entre o andar 0 e topFloor: um movimento válido para um andar diferente atualiza floor, adiciona 1 a trips e retorna true; um movimento inválido ou para o mesmo andar retorna false.

O código fornecido lê o andar superior e, em seguida, os andares de destino. Ele imprime floor 3 após um movimento ou stay 3 quando o movimento foi recusado e, por fim, trips: com a contagem.

Seu código deve ficar em Elevator.kt. Main.kt contém o código fornecido de entrada/saída e não pode ser editado.

Experimente você mesmo

fun main() {
    // Código de entrada/saída fornecido: mantenha-o 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 iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Programação Orientada a Objetos

Pratique por conta própria: Playground de Kotlin