2
respostas

trocando double por BigDecimal

Olá pessoal, boa tarde! Terminei a formação Java e Orientação a Objetos, e estou refatorando o código do bytebank com os conhecimentos adquiridos. Uma das mudanças que estou fazendo é a substituição do double para BigDecimal. Fiz as mudanças e notei que toda vez que vou fazer algum deposito, saque ou transferência, tenho que instanciar um novo BigDecimal, o que acaba deixando meio repetitivo por meio do new BigDecimal(valor). Segue o código:


package br.com.bytebank.banco.modelo;

import java.io.Serializable;
import java.math.BigDecimal;


/**
 * Classe que representa a moldura de uma conta
 * 
 * @autor João Gabriel
 */
public abstract class Conta implements Comparable<Conta>, Serializable {
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private transient Cliente titular;
    private int agencia;
    private int numero;
    protected BigDecimal saldo = new BigDecimal("00.00");
    private static int contador;

    public Conta(int agencia, int numero) {
        /**
         * Construtor para inicializar o objeto a partir da agencia e numero
         * 
         * @param agencia
         * @param numero
         */
        this.agencia = agencia;
        this.numero = numero;
        if (agencia < 1) {
            throw new IllegalArgumentException("Numero inválido.");
        }
        if (numero < 1) {
            throw new IllegalArgumentException("Número inválido.");
        }
        Conta.contador++;
        System.out.println("Total de contas criadas: " + Conta.contador + ".");
    }

    public void setTitular(Cliente titular) {
        this.titular = titular;
    }

    public Cliente getTitular() {
        return this.titular;
    }

    public void setAgencia(int agencia) {
        this.agencia = agencia;
    }

    public int getAgencia() {
        return this.agencia;
    }

    public void setNumero(int numero) {
        this.numero = numero;
    }

    public int getNumero() {
        return this.numero;
    }

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

    /**
     * 
     * @param valor
     * @throws SaldoInsuficienteException
     */
    public void saca(BigDecimal valor) throws SaldoInsuficienteException {
        if (this.saldo.compareTo(valor) < 0) {
            throw new SaldoInsuficienteException(
                    "Operação não realizada. Saldo insuficiente. Valor disponível: R$ " + this.saldo + ".");

        } else {
            this.saldo = this.saldo.subtract(valor);
        }
    }

    public abstract void deposita(BigDecimal valor);

    public void transfere(BigDecimal valor, Conta destino) throws SaldoInsuficienteException {
        saca(valor);
        destino.saldo = destino.saldo.add(valor);

    }

    public void ImprimeSaldo() {
        System.out.println("Saldo: R$ " + this.saldo);
    }

    @Override
    public boolean equals(Object ref) {
        Conta outra = (Conta) ref;
        if (this.agencia == outra.agencia && this.numero == outra.numero) {
            return true;
        }
        return false;
    }

    @Override
    public int compareTo(Conta outra) {
        return this.saldo.compareTo(outra.saldo);
    }

    @Override
    public String toString() {
        return "Titular: " + this.getTitular().getNome() + ", Agencia: " + this.agencia + " Número: " + this.numero + ", Saldo: " + this.saldo;
    }

}
package br.com.bytebank.banco.modelo;

import java.math.BigDecimal;

public class ContaCorrente extends Conta implements Tributavel {
    private transient CalculadorImposto calculador;

    public ContaCorrente(int agencia, int numero) {
        super(agencia, numero);
        calculador = new CalculadorImposto();

    }

    @Override
    public void saca(BigDecimal valor) throws SaldoInsuficienteException {
        BigDecimal valorASacar = valor.add(new BigDecimal("0.2"));
        super.saca(valorASacar);
    }

    @Override
    public void deposita(BigDecimal valor) {
        super.saldo = super.saldo.add(valor);

    }

    @Override
    public BigDecimal getValorImposto() {
        return this.calculador.getValorImposto(super.saldo);
    }

    @Override
    public String toString() {

        return "Conta Corrente, " + super.toString();
    }
}
package br.com.bytebank.banco.modelo;

import java.math.BigDecimal;

public class ContaPoupanca extends Conta {
    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    public ContaPoupanca(int agencia, int numero) {
        super(agencia, numero);
    }

    @Override
    public void deposita(BigDecimal valor) {
        super.saldo = super.saldo.add(valor);

    }

    @Override
    public String toString() {

        return "Conta Poupança, " + super.toString();
    }


}

Continua nos comentários ---->

2 respostas

Segue agora a classe de teste:

package br.com.bytebank.banco.teste;

import java.math.BigDecimal;

import br.com.bytebank.banco.modelo.*;

public class TesteContaBigDecimal {
    public static void main(String[] args) {
        Cliente joao = new Cliente("João Gabriel", "155.789.901-08", "Programador");
        Conta contaJoao = new ContaCorrente(123, 456);
        contaJoao.setTitular(joao);

        System.out.println(contaJoao.getSaldo());
        System.out.println(contaJoao);

        contaJoao.deposita(new BigDecimal("500"));
        contaJoao.ImprimeSaldo();

        Conta contaKatrine = new ContaPoupanca(789, 45685);

        contaJoao.transfere(new BigDecimal("120"), contaKatrine);
        contaKatrine.ImprimeSaldo();

        contaKatrine.saca(new BigDecimal("50"));
        contaKatrine.ImprimeSaldo();

        contaJoao.saca(new BigDecimal("20.50"));
        contaJoao.ImprimeSaldo();

        Conta contaHelena = new ContaCorrente(753, 154);
        contaHelena.deposita(new BigDecimal("800"));
        contaHelena.ImprimeSaldo();

        contaKatrine.transfere(new BigDecimal("40"), contaHelena);


    }
}

Como visto, tive que dar new várias vezes para poder fazer as operações. Há alguma forma de fazer com que na classe de testes só precisar passar o valor? Já tentei passar o new BigDecimal para os metodos saca, transfere e deposita, mas o código não compilou.

Oi, João, como vai?

Muito pertinente seu questionamento. Mas toda vez que vamos utilizar BigDecimal precisamos instanciar a classe.

E se definimos que os métodos vão receber um BigDecimal, eles precisam obrigatoriamente receber um BigDecimal, o que faria a gente de qualquer jeito ter que instanciar a classe BigDecimal.

Abraços e bons estudos!