Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Dúvida] Será que tem solução ou é code smells ?

Na aula de Herança e Polimorfismo para a T5 Oracle Java - 2023

Fiz o seguinte código:

package bytebankcontaspackage;

public class ContaCorrente extends Conta{
    /*public ContaCorrente() {
        super(); // referencia a classe Conta padrão , desde que exista.
    }*/
    private boolean clienteEspecial;
    private double limite;
    
    public ContaCorrente(int agencia, int numero, boolean clienteEspecial) {
        super(agencia, numero); // referencia ao construtor da classe Conta
        this.setClienteEspecial(clienteEspecial);
        if (this.clienteEspecial) {
            System.out.println("é cliente especial");
            super.deposita(getSaldo() + this.limite);
        }
            
    }
    
    @Override
    public boolean saca(double valor) {
        // TODO Auto-generated method stub
        double valorASacar = valor + 0.20;
        if (this.getClienteEspecial()== true) {
            System.out.println("transferencia sem taxa ");
            return super.saca(valor);
        }
            
        else {
            System.out.println("valor do cliente especial - "+ this.getClienteEspecial());
            System.out.println("Transferencia com taxa de 0.20");
            return super.saca(valorASacar);
        }
        
    }
    
    // getters
    public boolean getClienteEspecial() {
        return this.clienteEspecial;
    }
    
    // setters
    public void setClienteEspecial(boolean valor) {
        this.clienteEspecial = valor;
    }	
    
}

A minha dúvida é a seguinte na declaração dos atributos da classe ContaCorrente, como eu poderia modificar o mesmo para não usar o setClienteEspecial() dentro do construtor ? Se eu utilizar protected ainda é uma boa medida ou é mais seguro para o código eu ter criado essa estrutura ? Antes de criar o setClienteEspecial() eu fiz com que o meu atributo ClienteEspecial fosse false ou seja

private boolean clienteEspecial = false;

Mas notei que no construtor da classe ContaCorrente, mesmo quando eu passava o valor de true para a variável , ela continuava com o valor de false, daí eu tive que fazer esse setter, teria outra forma de fazer isso , isso seria um code smell ?

Obrigado

1 resposta
solução!

Olá Adalberto!

Sobre a sua dúvida, uma alternativa para não utilizar o método setClienteEspecial() dentro do construtor seria criar um novo construtor na classe Conta que recebesse um parâmetro booleano para definir se o cliente é especial ou não. Assim, na classe ContaCorrente, você poderia chamar esse novo construtor da classe Conta passando o valor booleano recebido como parâmetro.

Quanto a utilizar o modificador de acesso protected, ele permite que os atributos e métodos sejam acessados por classes que herdam da classe pai (Conta, no seu caso). Portanto, se você pretende criar outras classes que herdem de ContaCorrente, utilizar o modificador protected pode ser uma boa medida. Caso contrário, manter os atributos e métodos como private é mais seguro para o código.

Sobre o valor do atributo clienteEspecial não estar sendo atualizado no construtor, pode ser que o método setClienteEspecial() não esteja sendo chamado corretamente. Verifique se o valor está sendo passado corretamente como parâmetro no construtor da classe ContaCorrente.

Espero ter ajudado e bons estudos!