我是Java的新手,我正在为在线游戏Minecraft编写扩展/插件。
我最近开始了“更大”的项目,需要更多的课程才能保持整洁。 我仍然试图完全理解构造函数是如何工作的,但是最近的尝试导致了Stack Overflow(一个构造函数在循环中调用另一个)。
就我而言,我有两个班级,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”关键字)如何工作的简化,易于理解的解释将非常受欢迎。 提前谢谢!
答案 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
嵌套类,在这种情况下,您不需要额外的字段。