segunda-feira, 3 de dezembro de 2012

Objetos imutáveis

Objetos imutáveis são aqueles que não permitem modificação no seu estado após sua construção. Joshua Bloch, no seu livro Effective Java, faz a seguinte recomendação: 

"Classes deveriam ser imutáveis a menos que tenhamos uma ótima razão para que seja ao contrário. Se a classe não pode ser imutável, limite a mutabilidade.”  

A utilização deste recurso simplifica a codificação, caso as seguintes premissas sejam observadas:
  • Tenha certeza a classe não possa ser estendida ou tenha seus métodos sobrescritos: utilize o modificador "final" na definição da classe ou utilize fábricas estáticas e esconda os construtores com o modificador de acesso "private";
  • Todos os atributos da classe devem ter ser "private" e/ou "final".
  • Não devem estar disponíveis quaisquer métodos que possam modificar o estado do objeto, nem mesmo assessores de atribuição (sets);
  • Deve proporcionar a construção em uma única chamada, ao invés de disponibilizar um construtor sem argumentos, e sucessivas chamadas a assessores ou quaisquer outros métodos;
  • Se a classe precisa que quaisquer campos sejam mutáveis, estes terão que disponibilizar cópias defensivas.
Objetos imutáveis possuem uma grande lista de vantagens. Sem dúvidas, serão os objetos mais simples e robustos que você pode utilizar. Suas principais características são:
  • São de simples construção, teste e utilização;
  • São automaticamente "thread-safe" e não possuem problemas de sincronização;
  • Não necessitam de construtores de cópia, nem da interface “clone”;
  • Possibilitam seu uso em caches de objetos por utilizar hashCode em "lazy initializations";
  • Não necessitam serem copiados de forma defensiva quando utilizados como atributos em outros objetos (String, Integer, etc);
  • São perfeitos para utilizar como índices em Maps e elementos de um Set por não mudar de estado enquanto estão atribuídos a uma coleção;
  • Possuem o que Joshua Bloch chama de "failure atomicity": um objeto imutável quando lança uma exceção, esta nunca será deixada num estado indeterminado ou não desejado.
Exemplos de objetos imutáveis: String, Integer, Boolean, Datetime (Joda Time API).

Até a próxima! =] 

Nenhum comentário: