Não declare interfaces para objetos imutáveis
[EDIT] Onde os objetos em questão representam objetos de transferência de dados (DTOs) ou dados antigos simples (PODs)
Essa é uma orientação razoável?
Até agora, muitas vezes eu criei interfaces para classes seladas que são imutáveis (os dados não podem ser alterados). Tentei tomar cuidado para não usar a interface em nenhum lugar em que me importe com a imutabilidade.
Infelizmente, a interface começa a invadir o código (e não é apenas com o meu código que estou preocupado). Você acaba passando por uma interface e, em seguida, querendo passar para algum código que realmente quer assumir que o que está sendo passado é imutável.
Devido a esse problema, estou pensando em nunca declarar interfaces para objetos imutáveis.
Isso pode ter ramificações em relação aos testes de unidade, mas, além disso, isso parece uma diretriz razoável?
Ou existe outro padrão que devo usar para evitar o problema da "interface de expansão" que estou vendo?
(Estou usando esses objetos imutáveis por várias razões: Principalmente para segurança do encadeamento, pois escrevo muito código multiencadeado; mas também porque significa que posso evitar fazer cópias defensivas de objetos passadas para os métodos. O código se torna muito mais simples Em muitos casos, quando você sabe que algo é imutável - o que não acontece se você recebeu uma interface.De fato, muitas vezes você não pode sequer fazer uma cópia defensiva de um objeto referenciado por uma interface se ela não fornecer uma interface. operação de clone ou qualquer maneira de serializá-la ...)
[EDITAR]
Para fornecer muito mais contexto para minhas razões para querer tornar objetos imutáveis, consulte esta postagem de blog de Eric Lippert:
http://blogs.msdn.com/b/ericlippert/archive/tags/immutability/
Devo também salientar que estou trabalhando com alguns conceitos de nível inferior aqui, como itens que estão sendo manipulados / passados em filas de tarefas com vários threads. Estes são essencialmente DTOs.
Joshua Bloch também recomenda o uso de objetos imutáveis em seu livro Effective Java .
Acompanhamento
Obrigado pelo feedback, todos. Decidi seguir em frente e usar essa diretriz para os DTOs e seus afins. Está funcionando bem até agora, mas faz apenas uma semana ... Ainda assim, está parecendo bom.
Há algumas outras questões relacionadas a isso sobre as quais quero perguntar; notavelmente algo que estou chamando de "Imutabilidade profunda ou superficial" (nomenclatura que roubei da clonagem profunda e superficial) - mas essa é uma pergunta para outra hora.
List<Number>
que pode conter Integer
, Float
, Long
, BigDecimal
, etc ... Todos os quais são imutáveis si.