我怎样才能让我的主课回来?

时间:2015-08-07 14:28:27

标签: java

此主类由Bukkit框架初始化,无法再次初始化。

public class Demo extends JavaPlugin {
    public void onEnable() {

    }
}

如何从其他类访问其唯一实例?

public class CoolDown extends BukkitRunnable {
    public CoolDown(Demo mainClass, int time) {

    }
    public void run() {

    }
}

2 个答案:

答案 0 :(得分:3)

如果您想使用OOP方式:CoolDown类中,有一个类型为Demo的字段(或您的JavaPlugin扩展类)。您还可以在此处创建将在构造函数中传递的任何其他字段。

private final Demo plugin;
private int time;

然后使用CoolDown的构造函数

实例化字段
public CoolDown(Demo plugin, int time) {
    this.plugin = plugin;
    this.time = time;
}

现在,您可以根据需要使用plugin字段。例如:

public void run() {
    plugin.fooBar();
}

如果你想使用静态编程方式 (不推荐,你使用的是OOP语言是Java!):在你的Demo类,有一个类型为Demo的公共静态字段,没有任何值(顺便说一下,这是在类声明之后)。

public static Demo instance;

在你的插件的启用方法中(我建议把它放在方法调用的第一行):

instance = this;

然后您可以在CoolDown run()方法调用中使用

Demo.instance.fooBar();

我再次建议不要在Java中使用静态编程。一般来说,这是一种懒惰和糟糕的做法。

以下是OOP编程中的完整示例:

public class Demo extends JavaPlugin {
    public void onEnable() {
        Bukkit.getScheduler.scheduleMyEpicCooldown(new CoolDown(this, time), time);
    }
}


public class CoolDown extends BukkitRunnable {
    private final Demo plugin;
    private int time;

    public CoolDown(Demo plugin, int time) {
        this.plugin = plugin;
        this.time = time;
    } 

    public void run() {
        plugin.fooBar();
    }
}

答案 1 :(得分:2)

你必须重新发明Singleton Pattern

public class Demo extends JavaPlugin {
    private static Demo instance;
    public Demo() {
        instance = this;
    }
    public static Demo getInstance() {
        return instance;
    }
    @Override
    public void onEnable() {

    }
}

访问:

public class Cooldown extends BukkitRunnable {
    @Override
    public void run() {
        Plugin main = Demo.getInstance();
        main.getServer().broadcastMessage("No need to have the main instance as member variable on each class.");
    }
}