2012-08-16 20 views
5

He creado la siguiente clase con el método main, lo que crea una nueva instancia de Application y los casos de ApplicationModel, ApplicationView y ApplicationController para este particular Application.¿Cómo obtener una instancia específica de clase de otra clase en 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 

} 

sé, que siempre habrá sólo una instancia única de Application.

Y quiero obtener esta instancia particular en mis clases ApplicationModel, ApplicationView y ApplicationController.

¿Cómo es posible?

Respuesta

6

me gustaría utilizar un producto único en la clase de aplicación.

Ponga un método public static para devolver su única instancia de la aplicación.

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; 
    } 
} 

Puede leer más sobre patrón de diseño Singletonhere.

Cada vez que necesite el único Application ejemplo, usted debe hacer:

Application app = Application.getSharedApplication(); 
+0

Esta es la solución perfecta para mí. Muchas gracias! –

+0

Y, probablemente, cometió un error tipográfico. 'Application _app' debe ser estático, si se hace referencia desde el método estático.Por favor, corrígelo, ya que no estoy seguro. :) –

+1

@EdwardRuchevits: ¡sí! No fue un error tipográfico. Me olvido de poner la palabra clave allí. ** debe ** ser ** estático **. –

2

Desea utilizar el patrón de diseño de Singleton si necesita garantizar que solo habrá una instancia de la Aplicación y necesita que sea accesible para esas clases. No voy a comentar si es la mejor manera de crear su aplicación, pero cumplirá con los requisitos de su pregunta.

Singleton design pattern tutorial

+0

Sí, eso me convendrá perfectamente. ¡Gracias! –

0

He intentado esto en este momento, puede pasar this como arg constructor dentro del constructor de Application a otras clases (suponiendo que el tener una referencia declarada para la clase principal). De esta forma, obviamente puede hacer varias instancias de la clase Application. Si eso es lo que quiere ...

+0

Quiero crear solo una instancia de 'Aplicación'. De todos modos, gracias por tu respuesta. –

2

Cambiar el constructor de la clase que sea Applicationprivate y enviar el objeto this a las clases ApplicationXxx.

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

Usted será capaz de llamar a la clase newApplication desde dentro del método main.

Su ApplicationSettings, ApplicationModel, ApplicationView y ApplicationController deben actualizarse para tomar un objeto Application en sus constructores.

+0

Gracias por su respuesta. He estado usando este enfoque, pero no era lo que quería lograr. Ahora prefiero usar el patrón de diseño de Singleton, según lo propuesto por Pablo Santa Cruz y smcg. –

+0

@EdwardRuchevits No olvide que [Singletons son malvados] (http://stackoverflow.com/questions/137975/what-is-so-bad-about-singletons). – maba

1

Agregue el parámetro del tipo Application a los constructores de los compuestos. Cuando crea sus instancias simplemente pase this. Por ejemplo

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

Creo que el patrón de Singleton será mejor para mí, porque solo quiero una instancia de mi 'Aplicación'. ¡Pero gracias por tu respuesta! –

Cuestiones relacionadas