Pregunta

Estoy trabajando en Java en un proyecto bastante grande. Mi pregunta es sobre cómo estructurar mejor el conjunto de Propiedades para mi aplicación.

Enfoque 1: tener algún objeto de propiedades estáticas al que pueda acceder cada clase. (Desventajas: entonces, algunas clases pierden su generalidad si se las saca del contexto de la aplicación; también requieren llamadas explícitas a algún objeto estático que se encuentra en una clase diferente y pueden desaparecer en el futuro; simplemente no lo hace. siento bien, ¿me equivoco?)

Enfoque 2: haga que las propiedades sean instanciadas por la clase principal y transmitidas a las otras clases de aplicaciones. (Desventajas: terminas pasando un puntero al objeto Propiedades a casi todas las clases y parece ser muy redundante y engorroso; no me gusta ).

¿Alguna sugerencia?

¿Fue útil?

Solución

Me gusta usar la inyección de dependencia Spring para muchas de las propiedades. Puede tratar su aplicación como bloques de construcción e inyectar las propiedades directamente en el componente que las necesita. Esto preserva (alienta) la encapsulación. Luego, ensambla los componentes y crea la " clase principal " ;.

Un buen efecto secundario de la inyección de dependencia es que su código debería ser más fácil de probar.

Otros consejos

En realidad, el enfoque 2 funciona realmente bien.

Intenté usar un objeto de propiedades Singleton en un proyecto reciente. Luego, cuando llegó el momento de agregar funciones, necesito revisar el Singleton y lamenté tener que ubicar todos los lugares donde usé MySingleton.getInstance () .

El enfoque 2 de pasar un objeto de información global a través de sus diversos constructores es más fácil de controlar.

El uso de un setter explícito también ayuda.

class MyConfig extends Properties {...}

class SomeClass {
    MyConfig theConfig;
    public void setConfi( MyConfig c ) {
        theConfig= c;
    }
    ...
}

Funciona bien, y te alegrará que hayas controlado exactamente de forma precisa qué clases realmente necesitan información de configuración.

Si las propiedades son necesarias para muchas clases, optaría por el enfoque 1. O tal vez una variante en la que utilice el patrón de diseño de Singleton en lugar de todos los métodos estáticos. Esto significa que no tienes que seguir pasando algún objeto de propiedades. Por otro lado, si solo unas pocas clases necesitan estas propiedades, puede elegir el enfoque 2, por las razones que mencionó. También puede preguntarse qué tan probable es que las clases que escriba en realidad se vayan a reutilizar y, de ser así, qué tanto problema tiene el hecho de reutilizar el objeto de propiedades. Si la reutilización no es probable, no se moleste con ella ahora y elija la solución más sencilla para la situación actual.

Parece que necesita un componente de administrador de configuración. Se encontraría a través de algún tipo de localizador de servicios, que podría ser tan simple como ConfigurationManagerClass.instance () . Esto encapsularía toda esa diversión. O podrías usar un marco de inyección de dependencias como Spring.

Depende mucho de cómo los componentes se encuentren entre sí en su arquitectura. Si sus otros componentes se están pasando como referencias, haga eso. Solo sé consistente.

Si está buscando algo rápido, puede usar las propiedades del sistema, están disponibles para todas las clases. Puede almacenar un valor de cadena o si necesita almacenar una lista de "cosas" puede usar el método System.Properties (). Esto devuelve un objeto 'Propiedades' que es una tabla hash. Luego puedes guardar lo que quieras en la mesa. No es bonito, pero es una forma rápida de tener propiedades globales. YMMV

Por lo general, busco un objeto singleton que resida en un proyecto común y contenga una tabla hash de su propio espacio de nombres, lo que da como resultado una clase de propiedades para cada uno.

La inyección de dependencia también es una buena forma de hacerlo.

Me siento más cómodo cuando tengo un puntero estático en mis propiedades en memoria. algunas veces desea volver a cargar las propiedades en tiempo de ejecución u otra funcionalidad que sea más fácil de implementar con una referencia estática.

solo recuerda que ninguna clase es una isla. una clase reutilizable puede tener una clase cliente para mantener el núcleo libre de la referencia de singletone.

También puedes usar interfaces, solo intenta no exagerar.

El Enfoque 2 es definitivamente mejor.

De todos modos, no debe permitir que otras clases busquen a través del objeto de configuración. Debería injetar la configuración tomada en el objeto de configuración fuera del objeto.

Echa un vistazo a configuración de apache commons para obtener ayuda con la configuración Impl.

Así que en main () podrías tener

MyObject mobj = new MyObject();
mobj.setLookupDelay(appConfig.getMyObjectLookupDelay);
mobj.setTrackerName(appConfig.getMyObjectTrackerName);

En lugar de

MyObject mobj = new MyObject();
mobj.setConfig(appConfig);

donde appConfig es un contenedor alrededor de la biblioteca de configuración de apache que realiza toda la búsqueda de la base de valores en el nombre del valor en un archivo de configuración.

de esta manera, su objeto se vuelve fácilmente comprobable.

No he hecho Java por un tiempo, pero ¿no puedes simplemente poner tus propiedades en las propiedades de java.lang.System? De esta manera, puede acceder a los valores desde cualquier lugar y evitar tener un " global " clase de propiedad.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top