【问题标题】:How to get specific instance of class from another class in Java?如何从Java中的另一个类获取特定的类实例?
【发布时间】:2012-08-12 19:12:15
【问题描述】:

我使用main 方法创建了以下类,该方法为这个特定的Application 创建了Application 的新实例和ApplicationModelApplicationViewApplicationController 的实例。

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 类中获取这个特定的实例。

这怎么可能?

【问题讨论】:

    标签: java oop model-view-controller class instance


    【解决方案1】:

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

    Singleton design pattern tutorial

    【讨论】:

    • 是的,这将非常适合我。谢谢!
    【解决方案2】:

    我会在 Application 类上使用单例。

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

    您可以阅读更多关于单例设计模式here

    每次您需要唯一的 Application 实例时,您都需要这样做:

    Application app = Application.getSharedApplication();
    

    【讨论】:

    • 这对我来说是完美的解决方案。非常感谢!
    • 而且,您可能打错字了。 Application _app 应该是静态的,如果它是从静态方法引用的。请纠正它,因为我不确定。 :)
    • @EdwardRuchevits:是的!这不是错字。我只是忘了把关键字放在那里。它必须静态的
    【解决方案3】:

    我现在试过了,您可以将this 作为构造函数 arg 在Application 的构造函数中传递给其他类(假设为主类声明了引用)。这样,您显然可以创建 Application 类的多个实例。如果这是你想要的......

    【讨论】:

    • 我只想创建一个Application 的实例。无论如何,谢谢你的回答。
    【解决方案4】:

    Application 类的构造函数更改为private,并将this 对象发送到ApplicationXxx 类。

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

    您将能够从main 方法中调用Application 类上的new

    您的ApplicationSettingsApplicationModelApplicationViewApplicationController 必须更新为在其构造函数中采用Application 对象。

    【讨论】:

    • 感谢您的回答。我一直在使用这种方法,但这不是我想要实现的。现在我宁愿使用 Pablo Santa Cruz 和 smcg 提出的 Singleton 设计模式。
    • @EdwardRuchevits 别忘了Singletons are evil
    【解决方案5】:

    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
    
    }
    

    【讨论】:

    • 我认为,单例模式对我来说会更好,因为我只想要我的Application 的一个实例。不过谢谢你的回答!
    猜你喜欢
    • 1970-01-01
    • 2013-03-18
    • 2019-05-25
    • 2023-03-28
    • 1970-01-01
    • 2013-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多