2012-02-22 21 views
8

Uso el patrón de generador para varias clases de mi proyecto (argumentos múltiples, algunos obligatorios, algunos opcionales, etc.). Estas clases son inmutables (sin setters, deep copy for collections getters).Patrón de generador y persistencia

Ahora estoy tratando de almacenar esos objetos en una base de datos utilizando un marco de persistencia que construye objetos con constructor + setters predeterminados. ¡No me gustan mucho mis Constructores!

No quiero degradar esa configuración a POJO y perder las ventajas del diseño actual (flexibilidad, inmutabilidad, seguridad de la construcción).

Me agradaría cualquier comentario sobre las soluciones alternativas que se pueden utilizar en esta situación (podría envolver cada una de estas clases pero eso duplicaría el número de clases y preferiría evitar eso).

En realidad, uno post lo señala como una desventaja específica del patrón del Constructor.

EDITAR

Una answer propone utilizar constructor/setters privadas, sino que sólo funciona si los campos de la clase no son definitivos, que no es mi caso.

edición final

Gracias a todos.
Lo que creo que va a ser mi solución final se parece a esto y funciona bien (para que conste, estoy usando MongoDB + Morfina):

class AClass { 
    private final String aField; 
    private final AClass() { 
     aField = ""; 
    } 
    //Standard builder pattern after that - no setters (private or public) 
} 
+4

¿No puedes incluir los setters y el constructor predeterminado pero hacerlos privados? – DaveJohnston

+0

Buena pregunta - Comprobaré que – assylias

+0

Sé que Hibernate puede usar instaladores y constructores privados, solo me pregunta si tiene algo en contra de esto para su caso específico. – DaveJohnston

Respuesta

6

Como dije en mi comentario: puede incluir un constructor por defecto y todos los setters requeridos pero los hacen privados. De esta forma mantendrá la inmutabilidad de sus Objetos, pero un ORM como Hibernate podrá acceder a los métodos/constructor cuando lo necesite.

Cualquier otra persona podría acceder a estos métodos mediante el uso de la reflexión, pero también pueden acceder a las variables de miembros privados mediante el uso de la reflexión. Por lo tanto, no hay un inconveniente real al agregar los métodos privados.

+1

Eso funciona si los campos no son definitivos. Pero si lo son, entonces no puedo usar el constructor predeterminado/entidades privadas por razones obvias. – assylias

+3

Si el marco de persistencia utiliza el reflejo para acceder a un constructor privado, entonces debería poder establecer los campos de clases directamente. Esto funciona incluso si los campos son finales. – TDJoe

+1

Definir los campos como definitivos es obviamente parte de hacer que un Objeto sea inmutable, pero si no hay un método público para mutar el Objeto, ¿hay alguna necesidad de que los campos sean definitivos? ¿Además de asegurarse de no modificar los valores accidentalmente usted mismo en métodos internos de la clase? – DaveJohnston

Cuestiones relacionadas