No declare interfaces para objetos inmutables.
[EDITAR] Cuando los objetos en cuestión representan objetos de transferencia de datos (DTO) o datos antiguos simples (POD)
¿Es esa una pauta razonable?
Hasta ahora, a menudo he creado interfaces para clases selladas que son inmutables (los datos no se pueden cambiar). He tratado de tener cuidado de no usar la interfaz en ningún lugar donde me preocupe la inmutabilidad.
Desafortunadamente, la interfaz comienza a impregnar el código (y no es solo mi código lo que me preocupa). Terminas pasando una interfaz y luego quieres pasarla a un código que realmente quiere asumir que lo que se le pasa es inmutable.
Debido a este problema, estoy considerando nunca declarar interfaces para objetos inmutables.
Esto podría tener ramificaciones con respecto a las Pruebas de Unidad, pero aparte de eso, ¿esto parece una guía razonable?
¿O hay otro patrón que debería usar para evitar el problema de "interfaz de expansión" que estoy viendo?
(Estoy usando estos objetos inmutables por varias razones: principalmente para la seguridad de los subprocesos, ya que escribo mucho código multiproceso; pero también porque significa que puedo evitar hacer copias defensivas de los objetos pasados a los métodos. El código se vuelve mucho más simple en muchos casos en los que sabe que algo es inmutable, lo cual no ocurre si le han entregado una interfaz. De hecho, a menudo ni siquiera puede hacer una copia defensiva de un objeto al que se hace referencia a través de una interfaz si no proporciona operación de clonación o cualquier forma de serialización ...)
[EDITAR]
Para proporcionar mucho más contexto para mis razones para querer hacer que los objetos sean inmutables, vea esta publicación de blog de Eric Lippert:
http://blogs.msdn.com/b/ericlippert/archive/tags/immutability/
También debo señalar que estoy trabajando con algunos conceptos de nivel inferior aquí, como elementos que se están manipulando / pasando en colas de trabajo de subprocesos múltiples. Estos son esencialmente DTO.
También Joshua Bloch recomienda el uso de objetos inmutables en su libro Effective Java .
Seguir
Gracias por los comentarios, todos. He decidido seguir adelante y usar esta guía para los DTO y sus afines. Hasta ahora está funcionando bien, pero solo ha pasado una semana ... Aún así, se ve bien.
Hay algunos otros asuntos relacionados con esto sobre los que quiero preguntar; notablemente algo que llamo "Inmutabilidad profunda o superficial" (nomenclatura que robé de la clonación profunda y superficial), pero esa es una pregunta para otro momento.
List<Number>
que puede contener Integer
, Float
, Long
, BigDecimal
, etc ... Todos los cuales son inmutables sí mismos.