2012-08-16 10 views
5

Ho creato la seguente classe con il metodo main, che crea una nuova istanza di Application e istanze di ApplicationModel, ApplicationView e ApplicationController per questo particolare Application.Come ottenere un'istanza specifica della classe da un'altra classe in Java?

public class Application 
{ 

    // Variables 

    private ApplicationSettings   settings; 
    private ApplicationModel   model; 
    private ApplicationView    view; 
    private ApplicationController  controller; 

    // Constructor 

    public Application() 
    { 
     settings  = new ApplicationSettings(); 
     model   = new ApplicationModel(); 
     view   = new ApplicationView(model); 
     controller  = new ApplicationController(); 
    } 

    // Main method 

    public static void main(String[] args) 
    { 
     Application application = new Application(); 
    } 

    // Getters for settings, model, view, controller for instance of Application 

} 

so, che ci sarà sempre una sola istanza unica di Application.

E voglio ottenere questa particolare istanza nelle mie classi ApplicationModel, ApplicationView e ApplicationController.

Com'è possibile?

risposta

6

vorrei usare un singleton sulla classe Application.

Inserire un metodo public static per restituire la propria e unica istanza dell'applicazione.

public class Application 
{ 
    private Application() { } // make your constructor private, so the only war 
           // to access "application" is through singleton pattern 

    private static Application _app; 

    public static Application getSharedApplication() 
    { 
     if (_app == null) 
      _app = new Application(); 
     return _app; 
    } 
} 

Si può leggere di più su Singleton modello di progettazionehere.

Ogni volta che è necessario il solo e unico Application esempio, si fa:

Application app = Application.getSharedApplication(); 
+0

Questa è la soluzione perfetta per me. Grazie mille! –

+0

E, probabilmente, hai fatto un refuso. 'Applicazione _app' dovrebbe essere statica, se è referenziata dal metodo statico.Per favore, correggilo, perché non ne sono sicuro. :) –

+1

@EdwardRuchevits: sì! Non era un errore di battitura. Ho appena dimenticato di mettere la parola chiave lì. ** deve ** essere ** statico **. –

2

Si desidera utilizzare il modello di progettazione Singleton se è necessario garantire che ci sarà solo un'istanza di Applicazione e che è necessario che sia accessibile da tali classi. Non ho intenzione di commentare se è il modo migliore per costruire la tua applicazione, ma soddisferà i requisiti della tua domanda.

Singleton design pattern tutorial

+0

Sì, questo è perfetto per me. Grazie! –

0

Ho provato questo in questo momento, è possibile passare this come arg costruttore all'interno del costruttore di Application ad altre classi (assumendo che il avere un riferimento dichiarato per la classe principale). In questo modo puoi ovviamente creare più istanze della classe Application. Se questo è ciò che si vuole ...

+0

Voglio creare solo un'istanza di 'Applicazione'. Comunque, grazie per la tua risposta. –

2

Modificare la costruzione della classe di Application di essere private e inviare l'oggetto this alle ApplicationXxx classi.

private Application() 
{ 
    settings  = new ApplicationSettings(this); 
    model   = new ApplicationModel(this); 
    view   = new ApplicationView(this, model); 
    controller  = new ApplicationController(this); 
} 

Sarete in grado di chiamare new sulla classe Application dall'interno del metodo main.

tuo ApplicationSettings, ApplicationModel, ApplicationView e ApplicationController devono essere aggiornati per prendere un oggetto Application nei loro costruttori.

+0

Grazie per la risposta. Ho usato questo approccio, ma non era quello che volevo ottenere. Ora preferirei utilizzare il modello di design Singleton, come proposto da Pablo Santa Cruz e smcg. –

+0

@EdwardRuchevits Basta non dimenticare che [Singletons è il male] (http://stackoverflow.com/questions/137975/che- è-so-bad-about-singletons). – maba

1

Aggiungere il parametro del tipo Application ai costruttori dei materiali compositi. Quando crei le loro istanze, passa semplicemente this. Per esempio

public class Application { 
    String s = "Setting"; 
    class ApplicationSettings { 
    Application sc; 
    ApplicationSettings(Application sc){ 
     this.sc = sc; 
     System.out.println(sc.s); 
    } 
    } 

    // Variables 

    private ApplicationSettings settings; 

    // Constructor 

    public Application() 
    { 
    settings = new ApplicationSettings(this); 
    } 

    // Main method 

    public static void main(String[] args) 
    { 
    Application application = new Application(); 

    } 

    // Getters for settings, model, view, controller for instance of Application 

} 
+0

Penso che il pattern Singleton sarà migliore per me, perché voglio solo una istanza della mia 'Applicazione'. Ma grazie per la tua risposta! –

Problemi correlati