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

Protected como boa prática

Se é considerada uma boa prática deixar todos os atributos privados, de que outra maneira eu poderia acessar o saldo da classe Conta por uma de suas filhas sem que o atributo seja protected?

3 respostas

Olá Jean,

Nesse caso, você pode expor seu atributos por meio de métodos.

Seu atributo será privado, portanto não poderá ser acessado diretamente. Mas pode haver um método pra expor seu valor e métodos pra modificar seu valor.

A vantagem dessa abordagem, é que seus métodos podem restringir o acesso ao seu atributo. Por exemplo, validar se o valor passado atende uma regra de negócio.

Deixando o acesso direto a variável, outras classes poderiam modificar o valor a gosto, sem restrições.

Abs

Olá Jean,

Complementando a resposta do Eric, recomendo os cursos de Design Patterns e SOLID aqui da Alura. Eles são cursos de boas práticas de programação que explanam muito bem a importância de ter esses cuidados na hora de programar. As classes precisam ser montadas de maneira a impedir alterações externas (como por exemplo, vc modificar o valor de uma variável estando em outra classe), e ao mesmo tempo, facilitando a extensão de classes novas ao projeto sem ter que mexer muito no código antigo. Pode parecer mais fácil usar o protected (e em alguns casos é útil), mas com o passar dos cursos, você irá notar que isso pode deixar seu código mais propenso a ficar ilegível, com várias classes que estão emaranhadas umas nas outras.

Abs

solução!

Vou te dar um exemplo de como acessar sem usar o protected. Note que eu nem precisei usar herança (mas seria bem-vindo, para eu não precisar ter definido a variável saldo duas vezes). A única coisa que faltou é determinar um método na Classe1 chamado "setSaldo", onde eu conseguisse acessar ele da Classe2 e determinar um valor para ele logo no construtor:

public class Classe1 {

private double saldo;

public double getSaldo(){
    return this.saldo;
}

}

public class Classe2 {

private Classe1 classe1; //Crio uma referência à Classe1 com o nome de "classe1"
private double saldo;

public Classe2(){
    classe1 = new Classe1();
    this.saldo = classe1.getSaldo();

    //Posso simplificar essas duas linhas de cima por: "this.saldo = new Classe1().getSaldo();"
}

}