Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Getters e Setters

Estou tentando criar uma classe para representar uma pessoa, com os atributos nome, data de nascimento e altura. Além de criar um método para calcular a idade da pessoa.

Ao tornar alguns atributos privados, não consegui acessá-los mais. Como posso utilizar os "getters" e "setters" para acessar esses atributos?

fun main() {
    val pessoaJoao = Pessoa()
    pessoaJoao.nome = "João"
    pessoaJoao.altura = 1.83
    pessoaJoao.nascimento = 1948
    println(pessoaJoao.nascimento)
    println(pessoaJoao.altura)
    println(pessoaJoao.calculaIdade(pessoaJoao.nascimento))

}

class Pessoa {
    var nome = ""
    var altura = 0.0
    private var idade = 0
    private var nascimento = 0

    fun calculaIdade(idade: Int)  {
        this.idade = 2021 - nascimento
        return this.idade
    }
}
3 respostas

Fala Lucas, tudo bem ?

Não é comum criarmos getters e setters manualmente no kotlin, o ideal n esse seu caso, seria passar pelo construtor, por exemplo.

solução!

E ai mano, O kotlin é gente boa e já cria para gente os métodos get e set automaticamente quando nosso atributo é um var. Ele abstrai pra gente esse trabalho de criar os getters e setters, o que deixa o código um pouco mais limpo e bonito, na minha opinião.

Se você quiser testar, você pode fazer o seguinte. Quando você chama o nascimento no print ele vai no get do atributo. O mesmo vale pra quando você atribui um valor em qualquer campo, ele utiliza o set.

fun main() {
    val pessoaJoao = Pessoa()
    pessoaJoao.nascimento = 1
    print(pessoaJoao.nascimento)// resultado é 19
}
class Pessoa() {
    var nascimento = 0
        get() = if(field > 0) 19 else 0

}

mas se mesmo assim você quer deixar seu atributo como private, você pode criar um método get, com outro nome, por que se você criar com o mesmo nome do atributo, o kotlin reclama, pq ele já criou um pra você;

Mas ai você tira o private do atributo e seu campo fica aberto para todo mundo setar algum valor nele, e você não quer isso, por todo o problema de encapsulamento. Tem como colocar o set como private, basta fazer assim e ngm mais consegue setar valor no seu campo.

var nascimento = 0
        private set

Ah sim, obrigado.