2011-02-01 21 views
5

En Java, no hay acceso global como en C++. Entonces, ¿qué haría si quisieran crear un contenedor de objetos a los que se pueda acceder desde cualquier clase? O di un frijol java que contiene valores globales.Acceso global en Java

Por ejemplo, si estoy haciendo un simulador de ascensor, los campos que deben ser conocidos por todos como int numElevators tienen que ubicarse en alguna parte, ¿no? Lo mismo con el objeto de colección para los ascensores Elevators[] elevators.

Puedo pensar de una manera que es crear una clase singleton para almacenar todas esas variables globales. Luego use métodos estáticos para proporcionar acceso desde cualquier clase. Pero, ¿hay una solución más elegante?

+4

Por lo general, una solución bastante elegante no es el uso de variables globales o cosas equivalentes;) – delnan

+1

Es de suponer que los ascensores están en un edificio? Una clase de construcción tendría sentido. – diagonalbatman

Respuesta

4

Me gustaría esperar una instancia de Building para tener una colección de Elevators. Creo que hay muy pocas cosas en un proyecto que sean verdaderamente globales y, por lo general, se puede encontrar alguna entidad de gestión que debe contener y distribuir este conocimiento.

Al vincular esto dentro de dicha entidad, puede a) controlar el acceso y cambiar/refactorizar más fácilmente b) simular esto y facilitar las pruebas.

+0

Esto es absolutamente el camino correcto.El 99% del tiempo, la cosa para la que desea usar un Singleton puede asociarse con un objeto. Un ejemplo más difícil es algo así como la cantidad de pasos por los que desea ejecutar una simulación, pero esto puede resolverse teniendo un objeto "Simulación". – DJClayworth

+0

Me gusta la idea de una entidad administradora y una que también distribuya el conocimiento. Entonces, ¿un buen diseño sería una clase de singleton que contiene los ascensores, y una clase de administrador de ascensores que tiene una referencia a ese objeto de edificio único? – Steve

+0

Esperaría una instancia de ElevatorManager *, y para que esté disponible solo para las clases que necesitan saber al respecto. Si parece un número enorme, a menudo es un indicador de que su modelado no es del todo correcto. –

0

Puede crear una clase con un montón de campos públicos estáticos. Algo como

class AppGlobals { 
    public static final String IMPORTANT_STUFF = "something global..."; 
    .... 

} 

O puede leer en una configuración de propiedades para obtener datos simples como Cadenas y otras cosas.

También se pueden combinar 1 y 2.

Editar - para su ascensor/edificios ejemplo, un diseño adecuado OO eliminaría la necesidad de variables globales ....

1

puedo pensar en una manera que es crear una clase singleton para almacenar todas esas variables globales. Luego use métodos estáticos para proporcionar acceso desde cualquier clase. Pero, ¿hay una solución más elegante?

No, esa es la manera de hacerlo. Una combinación de métodos estáticos y singletons.

+0

Tengo una clase Building simple pero siempre llamando Building.getElevators() parece poco elegante. – Steve

+0

¿por qué? Cuando lo piensas, estás obteniendo los ascensores para el edificio con el que estás trabajando. El nombre es descriptivo. –

1

Puede crear una clase no singleton con los campos deseados, y proporcionar una instancia de esto para lo que necesite.

Reducir al mínimo la cantidad de código que presume un solo contexto hace que sea más fácil adaptarse posteriormente a contextos múltiples.

Por ejemplo, puede comenzar con un solo conjunto de ascensores, pero luego quiere conjuntos múltiples, para diferentes torres o edificios.

0

Es posible que desee ver en el Paradigma de diseño Monostate si se está alejando de Singleton. Aquí hay una buena pregunta sobre StackOverflow.

Monostate vs. Singleton

Cuestiones relacionadas