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

Aula 6, exercício 5 - Builders com atributos opcionais

Não ficou claro como utilizar o builder para implementar atributos opcionais mais facilmente do que com o construtor.

O que seria um atributo opcional?

É possível exemplificar essa implementação?

3 respostas

Boa tarde, André! Como vai?

Suponha que vc tenha uma classe ContaCorrente que representa contas correntes do fictício AluraBank! E que ao criar uma conta, podemos fazê-lo apenas com o número da nova conta ou, opcionalmente informando também o saldo inicial da conta. A nossa classe ficaria mais ou menos assim:

class ContaCorrente {
     private int numeroConta;
     private double saldo;

     public ContaCorrente(int numeroConta) {
          this.numeroConta = numeroConta;
     }

     public ContaCorrente(int numeroConta, double saldo) {
          this.numeroConta = numeroConta;
          this.saldo = saldo;
     }
}

Pois bem, esse problema foi fácil uma vez que só temos dois construtores. Agora imagine que o sistema cresceu e que opcionalmente podemos receber também o nome do cliente titular e que podemos criar uma conta com o número e o nome do titular ou número, nome do titular e saldo, além das outras duas opções já vistas antes. Isso nos forçaria a criar outros construtores que nos permitissem atender essa nova situação, totalizando assim 4 construtores.

Você já deve ter percebido que quanto mais complexa a situação e quanto mais atributos opcionais tivermos, maior será a quantidade de construtores.

É justamente pra evitar essa dor de cabeça e resolver situações assim que o builder pattern existe!

Pegou a ideia? Qualquer coisa é só falar!

DESAFIO: A título de exercitar o que foi aprendido no curso, você conseguiria fazer uma classe ContaCorrenteBuilder implementando esse padrão de projeto e que resolvesse essa nossa situação?

Grande abraço e bons estudos, meu aluno!

Legal! Ficou bem claro.

Muito obrigado!

Sobre a implementação, pode ver se está certo?

ContaCorrenteBuilder:

package br.com.alura.designpatternsI.Builder;
public class ContaCorrenteBuilder {

    private int numeroConta;
    private int numeroAgencia;
    private double saldo;
    private String nomeTitular;

    public ContaCorrenteBuilder addnumeroConta(int numeroConta) {
        this.numeroConta = numeroConta;
        return this;
    }

    public ContaCorrenteBuilder addnumeroAgencia(int numeroAgencia) {
        this.numeroAgencia = numeroAgencia;
        return this;
    }

    public ContaCorrenteBuilder addsaldo(double saldo) {
        this.saldo = saldo;
        return this;
    }

    public ContaCorrenteBuilder addnomeTitular(String nomeTitular) {
        this.nomeTitular = nomeTitular;
        return this;
    }

    public ContaCorrente constroi() {
        return new ContaCorrente(numeroAgencia, numeroAgencia, saldo, nomeTitular);
    }

}

Teste:

package br.com.alura.designpatternsI.Builder;

public class TestandoContaCorrenteBuilder {

    public static void main(String[] args, Object ContaCorrente) {

        ContaCorrenteBuilder builder1 = new ContaCorrenteBuilder();
        builder1.addnomeTitular("arctic monkeys")
        .addnumeroAgencia(123)
        .constroi();

        ContaCorrenteBuilder builder2 = new ContaCorrenteBuilder();
        builder2.addnomeTitular("nina simone")
        .addnumeroAgencia(456)
        .addsaldo(700.00)
        .constroi();

        ContaCorrenteBuilder builder3 = new ContaCorrenteBuilder();
        builder3.addnomeTitular("Hendrix")
        .addnumeroConta(456)
        .addsaldo(600.00)
        .constroi();

    ContaCorrenteBuilder builder4 = new ContaCorrenteBuilder();
        builder4.addnomeTitular("O Rappa")
        .constroi();

    ContaCorrenteBuilder builder5 = new ContaCorrenteBuilder();
        builder5.addnomeTitular("Calle13")
        .addnumeroConta(456)
        .addnumeroAgencia(001)
        .addsaldo(200.00)
        .constroi();

    }

}
solução!

Existe algum atalho para construir esse tipo de método automaticamente?

public ContaCorrenteBuilder addnumeroAgencia(int numeroAgencia) { this.numeroAgencia = numeroAgencia; return this; }