Estoy diseñando un motor de juegos en Java.Java: Imposición de objetos doblemente vinculados
En el núcleo de este motor existen las dos clases Asset y Attribute, donde un Asset tiene una lista de Atributos. La mayoría de los Atributos no necesitan ningún vínculo de respaldo a su Atributo, lo que significa que los Atributos pueden, y con frecuencia aparecen, en las listas de más de un Activo. Sin embargo, existe una extensión de atributo llamada UniqueAttribute, que es una implementación para aquellos que son específicos de su activo, y utilizan un enlace de regreso.
Idealmente, el método de mi addAttribute activos sería algo como esto si corté el otro código:
public void addAttribute(Attribute attribute){ if(attribute instanceof UniqueAttribute) ((UniqueAttribute)attribute).setAsset(this); attributeList.add(attribute); }
Por desgracia, ya que viven en diferentes paquetes, UniqueAttribute.setAsset() debe ser pública . Esto deja el método abierto a los usuarios externos del motor con el que meterse, y aunque pude simplemente decirlo usando este método directamente, es un error, parece bastante descuidado.
La segunda opción es proporcionar la UniqueAttribute con el activo en la construcción, lo que significa que el código en el punto de la creación sería algo como esto:
asset.addAttribute(new UniqueAttribute(asset));
Mientras que puedo agregar un cheque-y- descartable o afirmar para confirmar que se transfiere el activo correcto, básicamente estoy confiando en que el usuario conecte los dos, lo que también preferiría no hacer.
La tercera opción es morder la bala y poner 50 archivos de Java en el mismo paquete para que pueda utilizar la visibilidad estándar.
¿Hay algún tipo de patrón o algo que ayudará a unir estos dos juntos sin exponer los cables, o me obliga a poner todo en un solo paquete masivo?
Irrelevant rant: Siempre me ha disgustado que el concepto de subpaquetes en java no se haya ampliado realmente de manera significativa. Un subpaquete, en lo que respecta a Java, es simplemente un paquete diferente, y ha habido muchas ocasiones en que podría hacerlo con más modificadores de visibilidad directamente relacionados con esto.
¿Tal vez la opción 2 con algún tipo de fábrica que conoce la relación entre los atributos únicos y los activos? –
Aunque supongo que tener reglas especiales para subpaquetes podría haber funcionado, casi nunca es necesario (ya que puede usar sistemas como Spring u OSGi para forzar la separación entre interfaz e implementación) y habría hecho las cosas mucho más complejas por muy poca ganancia. Una implementación simple y confiable es más importante que una característica "linda" pero compleja. –