java - 如何正确连接类(构造函数中的堆栈溢出)

标签 java class constructor instances

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

我最近开始了“更大”的项目,需要更多的类来保持整洁。 我仍在尝试完全理解构造函数是如何工作的,但最近的尝试导致了堆栈溢出(一个构造函数在循环中调用另一个构造函数)。

以我为例,我有两个类,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”关键字)如何工作的简单、易于理解的解释将不胜感激。 提前致谢!

最佳答案

首先,作为 future 应用程序的指针,您可能需要查看 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 类中的方法,从而也避免了循环引用问题。

关于java - 如何正确连接类(构造函数中的堆栈溢出),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11880577/

相关文章:

C++ moSTLy 冗余默认和参数化构造函数违反 DRY

c++临时对象创建了吗?

java - 如果选择了某个 JCheckBox,如何删除它?

java - WebDriver > 在兄弟框架之间切换

c++ - C++ 类中的许多成员函数对性能有影响吗?

java - 类是否可以实现接口(interface)并执行该接口(interface)背后的逻辑

java - 如何使用 Swing 刷新 Windows 任务栏?

java - 整数和字符串 TCP 连接

c++ - 了解类构造函数的静态转换

c++ - 为什么内联在这里不起作用?