在类中使用需要构造函数参数的方法(Bukkit插件)

时间:2014-01-11 17:32:57

标签: java constructor minecraft bukkit

我正在为CraftBukkit编写一个插件,并且已经进入了将类和方法拆分为单独文件以进行组织的阶段。我遇到的问题是我需要将Plugin传递给其他类才能使用它的方法。例如:

SimpleBans.java

public class SimpleBans extends JavaPlugin {
    private final DatabaseManager dm = new DatabaseManager(this);
}

DatabaseManager.java

public class DatabaseManager {
    private Plugin plugin;
    public DatabaseManager(SimpleBans pluginConstructor) {
        plugin = pluginConstructor;
    }

public void writeData(String SQL) {
    // Pseudo code: Write plugin.getName(); into the database.
}

现在工作正常。但是,如果我想使用另一个类的writeData方法,我没有任何东西要作为参数传递,例如:

PlayerListener.java

public class PlayerListener {
    private final DatabaseManager dm = new DatabaseManager(SOMETHINGGOESHERE);
}

我不能在这里使用null,因为它必须是一个插件来匹配DatabaseManager.java中的构造函数参数。

这一直困扰着我多年。任何帮助都会受到欢迎。

3 个答案:

答案 0 :(得分:1)

为什么不使用带有null参数的构造函数?有原因吗?那你的课就是......

public class DatabaseManager {
    private Plugin plugin;

    public DatabaseManager() {
        this.plugin = new SimpleBeans();
    }

    public DatabaseManager(SimpleBans pluginConstructor) {
        plugin = pluginConstructor;
    }

    public void writeData(String SQL) {
        // Pseudo code: Write plugin.getName(); into the database.
    }

    ...
}

然后可以使用两种方式实例化DatabaseManager

希望我帮忙!

答案 1 :(得分:0)

DatabaseManager内创建类似以下内容的方法:

public class DatabaseManager {

    public static DatabaseManager initManager() {
        SimpleBans simpleBans = new SimpleBans(); //Or however you construct it
        return new DatabaseManager(simpleBans);
    }

}

然后在其他课程中,只需致电:

private final DatabaseManager dm = DatabaseManager.initManager();

我相信这是一种设计模式,但我忘了它的名字。

答案 2 :(得分:0)

请勿尝试在DatabaseManager内创建新的PlayerListener。相反,将DatabaseManager作为侦听器类的构造函数参数。这样,您可以在创建侦听器时使用已构造的DatabaseManager