2012-08-16 41 views
5

我用main方法创建了以下类,它为此特定Application创建Application的新实例和ApplicationModel,ApplicationViewApplicationController的实例。如何从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 

} 

我知道,总是只有一个唯一的Application实例。

我想在我的ApplicationModelApplicationViewApplicationController类中得到这个特定的实例。

这怎么可能?

回答

6

我会用在应用类单。

把一个public static方法返回您的一个和唯一的应用程序实例。

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

你可以阅读更多关于singleton设计模式here

每当你需要的唯一Application实例时,你这样做:

Application app = Application.getSharedApplication(); 
+0

这对我来说是完美的解决方案。非常感谢! – 2012-08-16 16:29:40

+0

而且,你可能犯了一个错字。 'Application _app'应该是静态的,如果它是从静态方法引用的。请纠正它,因为我不确定。 :) – 2012-08-16 16:48:33

+1

@EdwardRuchevits:是的!这不是一个错字。我只是忘记把关键字放在那里。它**必须是**静态**。 – 2012-08-16 20:41:39

2

如果您需要保证只有一个应用程序实例,并且您需要它可以被这些类访问,那么您希望使用Singleton设计模式。我不打算评论它是否是构建应用程序的最佳方式,但它会满足您的问题中的要求。

Singleton design pattern tutorial

+0

是的,这将非常适合我。谢谢! – 2012-08-16 16:30:27

0

我现在尝试这样做的权利,你可以通过thisApplication其他类的构造函数中构造ARG(假设有一个为主类声明的参考)。这样,你显然可以制作Application类的多个实例。如果这是你想要的...

+0

我想创建一个'Application'的实例。无论如何,谢谢你的回答。 – 2012-08-16 16:35:25

2

更改您的Application类的构造函数是private并发送this对象到ApplicationXxx类。

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

您将能够调用newApplication类从main方法中。

ApplicationSettingsApplicationModelApplicationViewApplicationController必须更新,以采取Application对象在它们的构造。

+0

谢谢你的回答。我一直在使用这种方法,但这不是我想要实现的。现在我宁可使用Pablo Santa Cruz和smcg提出的Singleton设计模式。 – 2012-08-16 16:33:08

+0

@EdwardRuchevits只要不要忘记[Singletons是邪恶的](http://stackoverflow.com/questions/137975/what-is-so-bad-about-singletons)。 – maba 2012-08-16 19:14:14

1

Application类型的参数添加到组合构造函数中。当你创建他们的实例只是通过this。例如,

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

我认为,Singleton模式对我来说会更好,因为我只需要一个“Application”实例。但是,谢谢你的回答! – 2012-08-16 16:36:48

相关问题