【问题标题】:How to properly connect classes (Stack overflow in constructors)如何正确连接类(构造函数中的堆栈溢出)
【发布时间】:2012-08-09 09:40:46
【问题描述】:

我对 Java 比较陌生,我正在为在线游戏 Minecraft 编写扩展程序/插件。

我最近开始了“更大”的项目,这些项目需要更多的课程来保持整洁。 我仍在尝试完全了解构造函数的工作原理,但最近的尝试导致 Stack Overflow(一个构造函数调用另一个构造函数,在循环中)。

以我为例,我有两个类,MainMySQL

主类初始化插件,MySQL 类联系数据库并将数据返回给任何调用它的类。

有问题的代码示例:

Main.java

class Main extends JavaPlugin {

    private final MySQL mysql = new MySQL();

    //Method which is called first 
    void onEnable(){

        //Just an example of initializing
        mysql.init();
        mysql.open();
    }
}

MySQL.java

class MySQL {

    private final Main main = new Main();

    void init(){}
    void open(){}
}

我知道问题出在哪里,只是不知道合适的解决方案,这适用于更多类。

另外,如果我有另一个类,main 会连接到 MySQL,另一个类会与之通信,我应该做类似 main.mysql.method 的事情?

对构造函数和实例(“new”关键字)如何工作的简化、易于理解的解释将不胜感激。 提前致谢!

【问题讨论】:

  • 为什么在 MySQL 中需要 Main 实例?
  • 在主类中,有一个方法可以提醒特定用户注意错误,所以我必须调用 main.mysqlErrors

标签: java class constructor instances


【解决方案1】:

首先,作为未来应用程序的指针,您可能想看看Design Patterns,它们往往使设计更简洁,更易于维护。

在您的情况下,您创建了一个Circular Reference。解决它的最简单方法是制作这样的东西:

class Main extends JavaPlugin {

    private final MySQL mysql;

    public Main(MySQL mysql)
    {
        this.mysql = mysql
    }

    //Class which is called first 
    void onEnable() {

        //Just an example of initializing
        mysql.init();
        mysql.open();
    }
}

class MySQL {

    private final Main main = new Main(this);

    void init(){}
    void open(){}
}

应该解决问题。

话虽如此,我假设MySQL 类将具有与数据库相关的机制。此类机制通常通过Singleton 设计模式公开。这种设计模式应该允许您仅在需要时访问MySQL 类中的方法,从而避免循环引用问题。

【讨论】:

  • 感谢您的回答,但是 private final MySQL mysql; 是否调用 MySQL 类而不是初始化 mysql 变量?
  • 如果Main 是字面的顶级入口点,那将不起作用,它通常必须有一个不带参数的构造函数。修复 MySQL 对我来说似乎更容易。
  • 多亏了你们,我以前一直在这样做,我只是觉得有更简单的方法。无论如何,谢谢。
  • @user1587051:变量在构造函数中初始化。最终变量只能分配一次,但应该允许您声明它并在以后分配它。
  • @ShiDoiSi:是的,我同意。我只是这样做是为了说明 OP。
【解决方案2】:

每次创建Main 类型的对象时,必须实例化字段mysql。当创建一个新的MySQL 实例时,由于它具有Main main 字段,因此会创建一个新的Main 实例。 20 goto 10 :-)

MySQL 类中,您可以通过两种方式避免创建另一个Main 实例:确保引用Main静态 成员,或者使MySQL 成为嵌套类在Main中,在这种情况下你不需要额外的字段。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-15
    • 2015-06-16
    • 1970-01-01
    • 2021-03-12
    • 2013-08-10
    • 1970-01-01
    • 2020-08-20
    • 1970-01-01
    相关资源
    最近更新 更多