"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.
- 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.
Até a próxima! =]
Nenhum comentário:
Postar um comentário