繁体   English   中英

MVC中的Singleton Class Swing递归调用自身

[英]Singleton Class in MVC Swing recursively calling itself

我有一个经理 class 被所有控制器(通过抽象)引用,这样我就可以根据用户输入在视图之间切换。 The ApplicationManager is a Singleton Class in which the MainFrame of my application (a JFrame ) is instantiated as well as two variables a JPanel and a Controller : currentView and currentController respectively.

问题:我在main(String args[])方法中遇到了一个问题,我正在调用ApplicationManagergetInstance()方法,该方法的构造函数实例化了登录页面视图和 controller。 但是我的 controller 也调用getInstance()方法。 因此,我的应用程序循环通过ApplicationManager()的构造函数,因为对象从未完全实例化。

在我的ApplicationManager的构造函数中,我有以下代码:

private ApplicationManager() {
    try {
        changePage("LoginPage");
        mainFrame = new MainFrame(currentView);
    } catch (ClassNotFoundException e) {
        e.getMessage();
    }
}

changePage()如下所示:

public void changePage(String pageName) throws ClassNotFoundException {
    try {
       Class<?> view = Class.forName("userinterface.frames." + pageName + "View");
       Class<?> controller = Class.forName("controller." + pageName + "Controller");
       Constructor<?> viewConstructor = view.getConstructor();
       Constructor<?> controllerConstructor = controller.getConstructor(view);

       currentView = (JPanel) viewConstructor.newInstance();
       currentController = (Controller) controllerConstructor.newInstance(currentView);

    } catch (NoSuchMethodException | IllegalAccessException | InstantiationException
                | InvocationTargetException e) {
       e.getMessage();
   }
}

Controller如下所示:

private ApplicationManager applicationManager;

public Controller() {
    applicationManager = ApplicationManager.getInstance();
}

public void goTo(String pageName) {
    try {
        applicationManager.changePage(pageName);
    } catch (ClassNotFoundException e) {
        e.getMessage();
    }
}

我不知道该怎么办。 我宁愿按照我的设想继续。 其中ApplicationManager与其同名。 但是这样做我需要 controller 和要实例化的视图。 对于初始屏幕,我需要 LoginPage。 我对任何和所有解决方案持开放态度。

  1. 您不需要在 changePage 方法中创建 Controller 实例。
  2. 如果您出于某种原因在 ApplicationManager class 中需要它,请在 ApplicationManager 构造函数或 changePage 方法中请求 Controller 实例。
    根据您共享的代码,尚不清楚您是否需要它。
  3. 停止使用硬编码的依赖项,而是在构造函数或设置器中请求它们。
  4. 使用“new”关键字而不是反射创建 Controller 实例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM