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?
Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!
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?
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();
}
}
Existe algum atalho para construir esse tipo de método automaticamente?
public ContaCorrenteBuilder addnumeroAgencia(int numeroAgencia) { this.numeroAgencia = numeroAgencia; return this; }