variable - Java-2 Way ''tiene una'' relación
java use enum values (5)
¿Hay algo objetable a esto, o está bien?
No hay una respuesta definitiva a esto. La mejor respuesta es: depende del diseño de su aplicación.
Cuando usarlo
Si su objeto Client
debe navegar al objeto Site
y su objeto Site
debe navegar al objeto Client
, entonces el ejemplo actual en su código está bien. Aún así, probablemente necesitará alguna forma de asociar estos elementos, probablemente mediante un campo de identificación adicional en una de las clases o en ambas.
Si sucede que trabajas con un marco que te ayuda a enlazar las clases automáticamente como Hibernate, entonces mantener la referencia circular no será un problema para ti.
Cuando no usarlo
Básicamente, para la serialización de texto, ya que generará un bucle infinito. Como ya se mencionó en la respuesta de Raibaz , una biblioteca como Jackson caerá en un bucle infinito mientras serializa la clase Client
o Site
en una cadena JSON 1 . Tenga en cuenta que esto también es válido cuando se serializa a otros datos de String
, como pasar los objetos a través de un servicio web JAX-WS en XML (más información: ¿Qué sucede con la clase genérica en el servicio web jax-ws? ).
1 Esto se puede resolver utilizando anotaciones ( @Something
) que pertenecen a una biblioteca específica, por ejemplo, @JsonManagedReference
y @JsonBackReference
de la biblioteca Jackson , como lo señaló @ SimonAndréForsberg, pero la desventaja de esta solución es que sus clases tendrán un acoplamiento estrecho con la biblioteca. .
Acabo de comenzar un proyecto para convertir a mi empleador en un software de gestión. Tengo una consulta molesta, pero potencialmente simple, en la que parece que no puedo encontrar ninguna información.
¿Es prudente / es una buena práctica tener una relación entre objetos de 2 vías? Entonces, ¿puede, por ejemplo, un objeto Client
''tener un'' Site
, y luego el Site
''tiene un'' Client
, donde el objeto Client
es el Client
que ''tiene'' el Site
?
public class Client {
Site site;
}
public class Site {
Client client;
}
¿Hay algo objetable (sin juego de palabras) para esto, o está bien? Actualmente estoy creando un UML simulado para el proyecto, y esto me ha estado molestando.
Es bastante normal y bastante común tener una asociación bidireccional como la de su ejemplo.
La única advertencia que puede considerar es cuando va a serializar sus objetos, por ejemplo, en json usando Jackson o cualquier otra biblioteca, debe excluir uno de los dos lados de la asociación de la serialización para evitar terminar en un bucle infinito.
Es común tener una asociación mutua entre objetos.
Por ejemplo, en algunos kits de herramientas de interfaz de usuario, un componente visual tendrá referencias a sus hijos, y cada niño puede tener una referencia a su padre.
El término has-a se usa con frecuencia para comunicar la propiedad de un objeto por otro. Cuando esto es cierto, la relación suele ser unidireccional.
Booch, Rumbaugh y Jacobson proporcionan una buena definición de estos términos en la "Guía del usuario de Unified Modeling Language" :
Agregación: una asociación simple entre dos clases representa una relación estructural entre pares, lo que significa que ambas clases están conceptualmente al mismo nivel, ninguna más importante que la otra. A veces, deseará modelar una relación "todo / parte", en la que una clase representa una cosa más grande (el "todo"), que consiste en cosas más pequeñas (las "partes"). Este tipo de relación se llama agregación, que representa una relación "has-a", lo que significa que un objeto de la totalidad tiene objetos de la parte.
Es común, pero consideraría qué tan débilmente acoplado desea que el objeto secundario sea de su padre. Si tiene la referencia al elemento principal del objeto secundario, no podrá reutilizar el objeto con otro elemento principal / no principal.
Trataré de mantener la relación de 1 vía siempre que sea posible. Las relaciones bidireccionales hacen que dos clases se unan y un cambio en una de ellas hace que la otra cambie dos. Pregúntese si tal relación es realmente natural ...
Si es necesario, simplemente asegúrese de que ambas sean interfaces o al menos una de ellas.