2011-02-01 16 views
5

In Java, non vi è alcun accesso globale come in C++. Quindi cosa si farebbe se volessero creare un contenitore di oggetti a cui sia possibile accedere da qualsiasi classe? O dire un java bean che contiene valori globali.Accesso globale in Java

Ad esempio, se sto simulando un ascensore, i campi che devono essere conosciuti da tutti come int numElevators devono essere posizionati in un posto giusto? Lo stesso con l'oggetto di raccolta per ascensori Elevators[] elevators.

Posso pensare a un modo che è quello di creare una classe singleton per memorizzare tutte quelle variabili globali. Quindi utilizzare metodi statici per fornire l'accesso da qualsiasi classe. Ma esiste una soluzione più elegante?

+4

Di solito, una soluzione molto elegante, non è quello di utilizzare globali o cose equivalenti;) – delnan

+1

Presumibilmente gli ascensori sono in un edificio? Una classe di costruzione avrebbe senso. – diagonalbatman

risposta

4

Mi aspetto un'istanza di Building per disporre di una raccolta di Elevators. Penso che ci siano pochissime cose in un progetto che sono veramente globali e di solito puoi trovare qualche entità gestente che dovrebbe contenere e distribuire questa conoscenza.

Legando questo all'interno di tale entità, è possibile a) controllare l'accesso e modificare/rifattorizzare più facilmente b) deriderlo e rendere più semplice il test.

+0

Questo è assolutamente il modo giusto.Il 99% delle volte in cui la cosa che volevi usare un Singleton può essere effettivamente associata ad un oggetto. Un esempio più difficile è qualcosa come il numero di passaggi per cui si desidera eseguire una simulazione, ma questo può essere risolto avendo un oggetto "Simulazione". – DJClayworth

+0

Mi piace l'idea di un'entità manageriale e una che distribuisce anche la conoscenza. Quindi un buon progetto sarebbe una classe singleton che contiene gli ascensori, e una classe manager dell'ascensore che ha un riferimento a quell'oggetto bulding singleton? – Steve

+0

Mi aspetterei un'istanza ElevatorManager *, e per renderlo disponibile solo alle classi che devono esserne a conoscenza. Se questo sembra un numero enorme, allora è spesso un puntatore che la tua modellazione non è del tutto giusta. –

0

È possibile creare una classe con una serie di campi statici pubblici. Qualcosa di simile

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

} 

Oppure si può leggere in una configurazione di proprietà per ottenere dati semplici come stringhe e quant'altro.

È possibile anche combinare 1 e 2.

Modifica - per il vostro ascensore/edifici ad esempio, una corretta progettazione OO eliminerebbe la necessità di variabili globali ....

1

mi viene in mente uno modo che è quello di creare una classe singleton per memorizzare tutte quelle variabili globali. Quindi utilizzare metodi statici per fornire l'accesso da qualsiasi classe. Ma esiste una soluzione più elegante?

No, questo è il modo per farlo. Una combinazione di metodi statici e singleton.

+0

Ho una classe Building singleton ma chiamare Building.getElevators() sembra inelegante. – Steve

+0

perché? Quando ci pensi, stai prendendo gli ascensori per l'edificio con cui lavori. Il nome è descrittivo. –

1

È possibile creare una classe non singleton con i campi desiderati e fornire un'istanza di questo a qualsiasi esigenza.

Riducendo al minimo la quantità di codice che presuppone un singolo contesto di questo tipo, è più facile adattarsi successivamente a più contesti.

Ad esempio, è possibile iniziare con un singolo set di ascensori, ma in seguito richiedere più set, per diverse torri o edifici.

0

Si potrebbe voler esaminare il paradigma Monostate Design se si sta allontanando da Singleton. Ecco una buona domanda StackOverflow su di esso.

Monostate vs. Singleton