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

时间:2012-08-09 09:40:46

标签: java class constructor instances

我是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”关键字)如何工作的简化,易于理解的解释将非常受欢迎。 提前谢谢!

2 个答案:

答案 0 :(得分: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类中的方法,从而避免循环引用问题。

答案 1 :(得分:0)

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

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