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?
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; }