Você está na página 1de 5

14/07/2017 Construindo objetos imutveis - Labs Bluesoft

(HTTP://LABS.BLUESOFT.COM.BR)
Home (http://labs.bluesoft.com.br)/ Artigos (http://labs.bluesoft.com.br/category/artigos/) / Construindo objetos imutveis

PAPO RETO (HTTP://LABS.BLUESOFT.COM.BR/CATEGORY/PAPO-RETO/)

ARTIGOS (HTTP://LABS.BLUESOFT.COM.BR/CATEGORY/ARTIGOS/)

PODCAST (HTTP://LABS.BLUESOFT.COM.BR/CATEGORY/PODCAST/)

QUEM SOMOS (HTTP://LABS.BLUESOFT.COM.BR/QUEM-SOMOS/)

OPORTUNIDADES (HTTP://LABS.BLUESOFT.COM.BR/CATEGORY/OPORTUNIDADES/)

CONTATO (HTTP://LABS.BLUESOFT.COM.BR/CONTATO/)

Construindo Objetos Imutveis

16 de novembro de 2015 Bruno Garcia (http://labs.bluesoft.com.br/author/bruno-garcia/) Artigos (http://labs.bluesoft.com.br/category/artigos/)


0 (http://labs.bluesoft.com.br/construindo-objetos-imutaveis/#respond)

Um objeto considerado imutvel quando seu estado interno, aps ser criado, no muda. Em alguns casos o objeto considerado imutvel mesmo que um atributo
interno mude, mas o estado parea imutvel de um ponto de vista externo. Isso pode acontecer em operao que sejam lazy, por exemplo.

O uso de objetos imutveis traz muitas vantagens e vrios tipos de problemas simplesmente desaparecem.

Nesse artigo vou mostrar como criar objetos imutveis, suas vantagens e como utiliza-los no dia a dia.

Seja sempre o primeiro a ver nossas novidades Meu e-mail Quero receber por e-mail
VANTAGENS E MAIS VANTAGENS
Objetos imutveis so conveis pois eles nunca sero alterados.
Objetos imutveis so thread-safe, ento voc no ter problemas com sincronizao nem aqueles bugs aleatrios difceis de resolver quando vrias threads
alteram o mesmo objeto.
Imutabilidade torna o cdigo mais fcil de escrever, entender e dar manuteno. Tambm evita aqueles bugs que voc precisa investigar o sistema inteiro para
descobrir onde o objeto est sendo alterado.
Objetos imutveis podem ser cacheados, da mesma forma que o Java faz com as Strings
Objetos imutveis so timos candidatos a chave de Map e elemento de Set.

ESTRATGIA PARA DEFINIR OBJETOS IMUTVEIS


1. Dena todas as suas variveis como private e nal. Dessa forma garantimos que as variveis no sero alteradas aps o objeto ser criado
2. No utilize mtodos setter, anal suas variveis sero nal.
3. Caso seu objeto receba um objeto mutvel, no permita que ele seja alterado. Crie uma cpia do objeto e no permita acesso direto a ele, no retorne a
referncia, nada de getObjetoMutavel(). O estado dos objetos referenciados no deve mudar.
4. Crie sua classe como nal. Dessa forma garantimos que o objeto no ter subclasses e, portanto, no ter seus mtodos sobrescritos.

http://labs.bluesoft.com.br/construindo-objetos-imutaveis/ 1/5
14/07/2017 Construindo objetos imutveis - Labs Bluesoft

public final class Quadrado{

private final double opacidade;


private final double tamanho;
(HTTP://LABS.BLUESOFT.COM.BR)
public Quadrado(double tamanho, double opacidade) {
this.opacidade = opacidade;
PAPO RETO (HTTP://LABS.BLUESOFT.COM.BR/CATEGORY/PAPO-RETO/)
this.tamanho = tamanho;
}
ARTIGOS (HTTP://LABS.BLUESOFT.COM.BR/CATEGORY/ARTIGOS/)
public double getOpacidade() {
return opacidade;
PODCAST
} (HTTP://LABS.BLUESOFT.COM.BR/CATEGORY/PODCAST/)

public double getTamanho() {


QUEM return
SOMOStamanho;
(HTTP://LABS.BLUESOFT.COM.BR/QUEM-SOMOS/)
}
}
OPORTUNIDADES (HTTP://LABS.BLUESOFT.COM.BR/CATEGORY/OPORTUNIDADES/)

PARMETROS OPCIONAIS
CONTATO (HTTP://LABS.BLUESOFT.COM.BR/CONTATO/)

No exemplo anterior temos um objeto imutvel com todos os seus parmetros no construtor. Mas se alguns dos nossos parmetros forem opcionais, a opacidade
por exemplo, teremos duas opes: criar um construtor para cada situao ou passar todos os valores sempre que o objeto for construdo. Imagine fazer isso com
vrios parmetros, seria extremamente improdutivo e chato.

public Quadrado(double tamanho) {...}

public Quadrado(double tamanho, double opacidade) {...}

public Quadrado(double tamanho, double opacidade, Cor cor, ...) {...}

new Quadrado(10, 0, branco, ...);

Para evitar essas duas situaes podemos utilizar o builder pattern (https://en.wikipedia.org/wiki/Builder_pattern) para criar o objeto.

IMUTABILIDADE COM O BUILDER PATTERN


Faremos algumas alteraes na classe Quadrado para utilizar o builder. Teremos um construtor private recebendo o builder como parmetro. Dessa forma foramos
a construo do objeto atravs do builder. Tambm incluiremos o mtodo toBuilder. Explicarei a funo desse mtodo mais a frente.

Criaremos o nosso builder como uma inner class contendo dois construtores. Um construtor, public, contendo todos os parmetros obrigatrios e o outro, private,
que recebera o Quadrado como parmetro. Esse construtor ser utilizado para copiar o objeto e ser acessado apenas pelo mtodo toBuilder, para padronizar a
cpia.

Os mtodos do builder tero os mesmos nomes das variveis sem o prexo set, to comum em POJOs. O retorno dos mtodos ser o prprio builder, dessa forma
criamos uma interface uente.

E para criar nosso Quadrado temos o mtodo build.

http://labs.bluesoft.com.br/construindo-objetos-imutaveis/ 2/5
14/07/2017 Construindo objetos imutveis - Labs Bluesoft

package test;

public class Quadrado {

private
(HTTP://LABS.BLUESOFT.COM.BR)
final double opacidade;

private final double tamanho;

PAPO RETO (HTTP://LABS.BLUESOFT.COM.BR/CATEGORY/PAPO-RETO/)


private Quadrado(Builder builder) {
this.opacidade = builder.opacidade;
this.tamanho
ARTIGOS = builder.tamanho;
(HTTP://LABS.BLUESOFT.COM.BR/CATEGORY/ARTIGOS/)
}

PODCAST (HTTP://LABS.BLUESOFT.COM.BR/CATEGORY/PODCAST/)
public double getOpacidade() {
return opacidade;
}
QUEM SOMOS (HTTP://LABS.BLUESOFT.COM.BR/QUEM-SOMOS/)
public double getTamanho() {
return tamanho;
OPORTUNIDADES (HTTP://LABS.BLUESOFT.COM.BR/CATEGORY/OPORTUNIDADES/)
}

CONTATO (HTTP://LABS.BLUESOFT.COM.BR/CONTATO/)
public Builder toBuilder() {
return new Builder(this);
}

public static class Builder {

private double opacidade;


private double tamanho;

public Builder(double tamanho) {


this.tamanho = tamanho;
}

private Builder(Quadrado quadrado) {


tamanho = quadrado.tamanho;
opacidade = quadrado.opacidade;
}

public Builder opacidade(double opacidade) {


this.opacidade = opacidade;
return this;
}

public Builder tamanho(double tamanho) {


this.tamanho = tamanho;
return this;
}

public Quadrado build() {


return new Quadrado(this);
}
}
}

A interface uente do builder deixa o cdigo simples e legvel.

Quadrado quadrado = new Quadrado.Builder(10)


.opacidade(.2)
.build();

O mtodo toBuilder fornece uma forma simples e padronizada para copiar e editar um objeto imutvel. No exemplo abaixo copiamos o objeto quadrado e alteramos
a propriedade opacidade para 0.3.

Quadrado quadradoNovo = quadrado


.toBuilder()
.opacidade(.3)
.build();

CONCLUSO

http://labs.bluesoft.com.br/construindo-objetos-imutaveis/ 3/5
14/07/2017 Construindo objetos imutveis - Labs Bluesoft

Imutabilidade torna o cdigo mais fcil de escrever, entender e dar manuteno. Utilize objetos imutveis sempre que possvel, eles evitam vrios tipos de bugs.

Utilizando o Builder pattern temos uma forma padronizada para criar, copiar e editar objetos imutveis.
(HTTP://LABS.BLUESOFT.COM.BR)

Este artigo foi publicado primeiro em: brgarcia.com (http://brgarcia.com/2015/11/construindo-objetos-imutaveis/)

PAPO RETO (HTTP://LABS.BLUESOFT.COM.BR/CATEGORY/PAPO-RETO/)


Related Articles:
ARTIGOS (HTTP://LABS.BLUESOFT.COM.BR/CATEGORY/ARTIGOS/)
Bluesoft News #21 Melhores De Junho (http://labs.bluesoft.com.br/?p=8105)
Bluesoft News #20 Melhores De Maio (http://labs.bluesoft.com.br/?p=8091)
PODCAST
API para(HTTP://LABS.BLUESOFT.COM.BR/CATEGORY/PODCAST/)
Gerao de Grcos (http://bluesoft.wordpress.com/2007/12/29/api-para-geracao-de-gracos/)
JPA e Hibernate Existe diferena? (http://labs.bluesoft.com.br/?p=7946)
QUEM SOMOSviews
Mapeando (HTTP://LABS.BLUESOFT.COM.BR/QUEM-SOMOS/)
com Hibernate no spring-data (http://labs.bluesoft.com.br/?p=7917)

---
OPORTUNIDADES (HTTP://LABS.BLUESOFT.COM.BR/CATEGORY/OPORTUNIDADES/)

Este Post um oferecimento de Acelerato Gesto de Projetos geis e Help Desk


CONTATO (HTTP://LABS.BLUESOFT.COM.BR/CONTATO/)

No perca tempo, acesse acelerato.com (http://www.acelerato.com), cadastre-se gratuitamente e descubra como podemos ajud-lo.

Post Footer automatically generated by Add Post Footer Plugin (http://www.freetimefoto.com/add_post_footer_plugin_wordpress) for wordpress.

Curtir 4 pessoas curtiram isso. Cadastre-se para ver do que seus amigos gostam.

Bruno Garcia (Http://Labs.Bluesoft.Com.Br/Tag/Bruno-Garcia/) Objeto (Http://Labs.Bluesoft.Com.Br/Tag/Objeto/)

Objetos Imutveis (Http://Labs.Bluesoft.Com.Br/Tag/Objetos-Imutaveis/)

LEAVE A COMMENT

Name

Email

Website

Message

Notique-me sobre novos comentrios por e-mail.


SEND

Notique-me sobre novas publicaes por e-mail.

http://labs.bluesoft.com.br/construindo-objetos-imutaveis/ 4/5
14/07/2017 Construindo objetos imutveis - Labs Bluesoft

Pesquisar por:

Pesquisar PESQUISAR

(HTTP://LABS.BLUESOFT.COM.BR)

CATEGORIAS
PAPO RETO (HTTP://LABS.BLUESOFT.COM.BR/CATEGORY/PAPO-RETO/)
Categorias
ARTIGOS (HTTP://LABS.BLUESOFT.COM.BR/CATEGORY/ARTIGOS/)
Selecionar categoria

PODCAST (HTTP://LABS.BLUESOFT.COM.BR/CATEGORY/PODCAST/)

QUEM SOMOS (HTTP://LABS.BLUESOFT.COM.BR/QUEM-SOMOS/)

OPORTUNIDADES (HTTP://LABS.BLUESOFT.COM.BR/CATEGORY/OPORTUNIDADES/)

CONTATO (HTTP://LABS.BLUESOFT.COM.BR/CONTATO/)

(https://www.acelerato.com/projetos/)

TPICOS RECENTES

Design Thinking | Larissa Ruana | Papo Reto (http://labs.bluesoft.com.br/design-thinking-larissa-ruana/)

O que UX? | Bruno Oliveira | Papo Reto (http://labs.bluesoft.com.br/o-que-e-ux/)

Bluesoft News #21 Melhores De Junho (http://labs.bluesoft.com.br/bluesoft-news-21-melhores-de-junho/)

Bluesoft News #20 Melhores De Maio (http://labs.bluesoft.com.br/bluesoft-news-20-melhores-de-maio/)

API para Gerao de Grcos (http://labs.bluesoft.com.br/api-para-geracao-de-gracos/)

TAGS

papo reto (http://labs.bluesoft.com.br/tag/papo-reto-2/)


bluesoft (http://labs.bluesoft.com.br/tag/bluesoft/)
andr faria (http://labs.bluesoft.com.br/tag/andre-faria/)
Agilidade (http://labs.bluesoft.com.br/tag/agilidade-certa/)

acelerato (http://labs.bluesoft.com.br/tag/acelerato/)
Bluesoft Labs (http://labs.bluesoft.com.br/tag/bluesoft-labs/)
Wilson Souza (http://labs.bluesoft.com.br/tag/wilson-souza/) ismael soares (http://labs.bluesoft.com.br/tag/ismael-soares/)

http://labs.bluesoft.com.br/construindo-objetos-imutaveis/ 5/5

Você também pode gostar