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

Violação de Encapsulamento?

Boa tarde!

Nesse código:

class Conta{
    int numero;
    Cliente titular;
    private double saldo;
    private double limite;

    public Conta(int numero, double limite){
        this.numero = numero;
        this.limite - limite;
    }

    public void saca(double valor){
        if(valor > this.saldo + this.limite){
            System.out.println("Saque invalido");
        } else {
            this.saldo = this.saldo - valor;
        }
    }

    public void deposita(double valor){
        this.saldo = this.saldo + valor;
    }

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

    public void setLimite(double novoLimite){
        this.limite = novoLimite;
    }
}

Considerando que o atributo numero é público e o atributo limite é privado:

class Conta{
    int numero;
    Cliente titular;
    private double saldo;
    private double limite;
    ...
}

O Construtor:

public Conta(int numero, double limite){
    this.numero = numero;
    this.limite = limite;
}

Não deveria estar escrito assim?

public Conta(int numero, double limite){
    this.numero = numero;
    this.setLimite(limite);
}

Nesse caso, poderia se dizer que o encapsulamento não foi violado (nem aparece mensagem de erro) porque é a própria Classe que está manipulando o atributo privado "limite"?

2 respostas
solução!

Exatamente, Jonas.

O encapsulamento só diz respeito às entidades "externas" ao que estamos querendo esconder, não à própria entidade. Falo dessa forma porque além de se aplicar para atributos ou métodos dentro de uma classe, como você está vendo, também serve para classes dentro de um pacote (não se preocupe se ainda não viu o que é um pacote, de maneira simplificada é uma "pasta" onde classes com função semelhante são agrupadas)

Só tenho uma pequena ressalva, quando você diz:

Considerando que o atributo numero é público e o atributo limite é privado

Na verdade, o atributo numero não tem a palavra reservada public marcando ele como publico. A este tipo de atributo chamamos de friendly (ou também default), que tem um comportamento um pouco diferente: o atributo é visível fora da classe, mas apenas para classes do mesmo pacote, então não é 100% público.

Obrigado pelo resposta Bruno!