0

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

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

例如,就我而言,我有两个类, Main并且MySQL.

主类初始化插件,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”关键字)如何工作的简化、易于理解的解释将不胜感激。提前致谢 !

4

2 回答 2

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该类将具有与数据库相关的机制。这种机制通常通过单例设计模式暴露出来。这种设计模式应该允许您MySQL仅在需要时访问类中的方法,从而避免循环引用问题。

于 2012-08-09T09:53:26.027 回答
0

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

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

于 2012-08-09T09:54:37.113 回答