Criando um código Java usando Builder pattern
Se você estiver usando uma linguagem que suporte orientação a objetos em seu projeto, provavelmente existem algumas linhas de códigos com o Builder pattern. Se não, este post vai te ajudar a entender sobre um dos Design Patterns mais utilizados em projetos orientado a objetos. O que é o Builder Pattern? Builder Pattern pertence a uma área do Engenheiro de Software chamada Design Patterns, a ideia por trás de um padrão é resolver problemas comuns em seu projeto seguindo as melhores práticas. Builder Pattern é muito útil quando precisamos fornecer uma melhor solução na parte de criação de objetos em nosso projeto. Às vezes precisamos instanciar um objeto com muitos parâmetros e isso pode ser um problema se você passar um valor de parâmetro errado. Coisas como essas acontecem sempre e resultam em erros de compilação e você precisará descobrir onde está o problema e talvez refatorar o código para melhorá-lo. Vamos escrever algumas linhas de código para entender como o Builder Pattern funciona e quando aplicá-lo. O código abaixo é um exemplo de uma classe tradicional com construtor usado para carregar valores quando o objeto é instanciado. public class PersonalInfo {
private final String firstName ;
private final String lastName ;
private final Date birthDate ;
private final String address ;
private final String city ;
private final String zipCode ;
private final String state ;
private final int population ;
public PersonalInfo(String firstName , String lastName ,
Date birthDate , String address ,
String city , String zipCode ,
String state , int population){
this . firstName = firstName ;
this . lastName = lastName ;
this . birthDate = birthDate ;
this . address = address ;
this . city = city ;
this . zipCode = zipCode ;
this . state = state ;
this . population = population ;
}
} E agora podemos instanciar o objeto simulando o código do cliente. PersonalInfo personalInfo
= new BuilderPattern( "Mônica" , "Avelar" ,
new Date() , "23 Market Street" ,
"San Francisco" , "94016" ,
"CA" , 800000 ) ; Se você reparar, para instanciar o objeto devemos passar todos os valores referentes a cada propriedade da nossa classe e há uma grande chance de passar um valor errado. Outra desvantagem dessa abordagem é a possibilidade de não escalá-la. Neste exemplo temos algumas propriedades mas no futuro, podemos adicionar mais propriedades e a desvantagem fica mais clara. Aplicando Builder Pattern Vamos reescrever o código acima aplicando Builder Pattern e ver as diferenças. public class PersonalInfo {
private final String firstName ;
private final String lastName ;
private final Date birthDate ;
private final String address ;
private final String city ;
private final String zipCode ;
private final String state ;
private final int population ;
public static class Builder {
private String firstName ;
private String lastName ;
private Date birthDate ;
private String address ;
private String city ;
private String zipCode ;
private String state ;
private int population ;
public Builder firstName (String value) {
firstName = value ;
return this;
}
public Builder lastName (String value) {
lastName = value ;
return this;
}
public Builder birthDate (Date value) {
birthDate = value ;
return this;
}
public Builder address (String value) {
address = value ;
return this;
}
public Builder city (String value) {
city = value ;
return this;
}
public Builder zipCode (String value) {
zipCode = value ;
return this;
}
public Builder state (String value) {
state = value ;
return this;
}
public Builder population ( int value) {
population = value ;
return this;
}
public BuilderPattern build () {
return new BuilderPattern( this ) ;
}
}
public PersonalInfo(Builder builder){
firstName = builder. firstName ;
lastName = builder. lastName ;
birthDate = builder. birthDate ;
address = builder. address ;
city = builder. city ;
zipCode = builder. zipCode ;
state = builder. state ;
population = builder. population ;
}
} Se você comparar os dois códigos, perceberá que o primeiro é menor e melhor para entender do que o segundo, e eu concordo. A vantagem do uso ficará clara para o próximo exemplo quando criarmos um objeto baseado no Builder Pattern. Instanciando um objeto utilizando Builder Pattern PersonalInfo personalInfo =
new Builder()
.firstName( "Mônica" )
.lastName( "Avelar" )
.birthDate( new Date())
.address( "23 Market Street" )
.city( "San Francisco" )
.zipCode( "94016" )
.state( "CA" )
.population( 80000 )
.build() ; Este último exemplo de criação de objeto utilizando o Builder Pattern, torna um código organizado seguindo as melhores práticas e de fácil leitura. Outra vantagem do Builder é que, podemos identificar cada propriedade antes de passar valores. Para ser sincero, tenho usado o Builder Pattern em meus projetos e recomendo fortemente que você faça o mesmo em seus próximos projetos. Material de estudo Se quer aprender mais sobre o assunto e alcançar um alto nível de conhecimento, recomendo fortemente a leitura do(s) seguinte(s) livro(s): Use a cabeça: Java é um clássico onde qualquer iniciante no assunto deve ler e estudar. Neste livro você aprenderá sobre os principais pilares de Java como, orientação a objetos, criação de classes, interfaces e seu funcionamento, controlar exceções, objetos genéricos e muito mais. Se quer entrar de cabeça neste mundo, é uma excelente opção! Padrões de Projeto é um livro no qual recomendamos após alcançar uma certa maturidade em programação em geral. Escrito por grandes nomes do assunto e traduzido para o português, Padrões de Projeto ou Design patterns como também são conhecidos, são padrões e estratégias que te ajudará a resolver diferentes desafios arquiteturais, aplicando soluções de forma elegante. São estratégias em que desenvolvedores de todo o mundo tem adotado em seus projetos. Imagina se você precisa atuar em um projeto internacional, caso este projetos tem adotado estratégias de Padrões de projeto, você não terá nenhuma grande dificuldade em entender a dinâmica e a arquitetura do código ou caso contrário, você mesmo poderá aplicar os conhecimentos adquiridos através deste livro. O mais interessante que Padrões de Projeto independem de linguagem de programação, é possível aplicar em qualquer outra linguagem, ou seja, é um conteúdo 100% reutilizável. Java Efetivo escrito por Joshua Bloch e traduzido para o português, é um livro excelente para aqueles que possuem um pouco mais de experiência com Java mas que precisam aprofundar em detalhes mais específicos da linguagem como, quando e como usar específicos Padrões de Projeto ou Design Patterns, utilização de Lambdas e Streams, concorrências e serializações. Para aqueles que possuem mais de experiência, é um excelente material de consulta. Espero que tenha curtido!