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 é privadoSaída:
1Isso 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 addUm 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" }
}Desafio
FácilComplete 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}")
}
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
1Classes e Objetos
Trabalhando com ArquivosDefinindo ClassesConstrutores PrimáriosBlocos init e ValidaçãoConstrutores SecundáriosRecapitulação - Cartão da Biblioteca4Herança
Classes Abertas e SubclassesSobrescrevendo Membrossuper e ConstrutoresClasses AbstratasRevisão - Diretório de Funcionários2Propriedades e Encapsulamento
Acessores PersonalizadosModificadores de VisibilidadeSetters Privadoslazy e lateinitRevisão - Conta Bancária5Interfaces
Declarando InterfacesMétodos PadrãoMúltiplas InterfacesInterfaces como TiposRecapitulação - Métodos de Pagamento8Genéricos
Funções genéricasClasses genéricasRestrições de tipoVariância com in e outRecapitulação - Fila de prioridade11Projeto: Gerenciamento de Biblioteca
Livros e MembrosEmpréstimo de LivrosPratique por conta própria: Playground de Kotlin