如何将主类的实例传递给多个侦听器?

时间:2014-05-07 22:32:21

标签: java listener bukkit

所以,我一直在研究一个插件。它很棒,直到我偶然发现了一个问题。我正在使用单独的Listener(implements Listener)类来管理我的事件,但对于其中一些,我需要访问JavaPlugin方法,比如获取配置文件。

在我的侦听器类中使用构造函数 ,但如果我尝试在另一个类中使用相同的东西,Eclipse会给它一个可爱的红色下划线,说blank final field plugin may have not been initialized

private final MainClass plugin;
public ListenerClass(MainClass instance){
    this.plugin = instance;
}

如前所述,上面的代码可以工作,但只适用于一个监听器。 使用返回对象的方法时, 下的构造函数会抛出NPE。我不知道这是不是因为插件实例实际返回null,或者如果没有句柄它是null

// The only difference between this constructor and the last is that the final
// modifier was removed.
private MainClass plugin;
public ListenerClass(MainClass instance){
    this.plugin = instance;
}

FileConfiguration config = plugin.getConfig(); // throws NPE
// Let's pretend that the line above isn't there, and I just use the getConfig() method instead.

@EventHandler
public void onJoin(PlayerJoinEvent event){
    if(plugin.getConfig().getString("Strings.cat-toy").toLowerCase().equals("string")){ // throws NPE
        // do stuff
    }
}

2 个答案:

答案 0 :(得分:4)

我做的事情与大多数人的做法截然不同。说你的班级extends JavaPluginMain.java,你可以在任何方法中添加以下代码:

public static Main plugin;

然后在onEnable()

中添加此内容
plugin = this

所以,你的Main类可能看起来像这样。

public class Main extends JavaPlugin{
  public static Main plugin; //create the variable

  @Override
  public void onEnable(){
    plugin = this; //assign plugin to this class
    //other onEnable things
  }

  @Override
  public void onDisable(){
    //onDisable things
    plugin = null; //best to put this AFTER running any methods here
  }
}

然后,在您要使用JavaPlugin方法的任何课程中,只需使用Main.plugin

所以,如果你想在另一个类中获得插件的配置,你可以这样做:

YamlConfiguration config = Main.plugin.getConfig();

确保在将plugin分配给主文件后执行此操作。假设Handler.setup()中使用YamlConfiguration config = Main.plugin.getConfig();,并且您希望在启用插件时运行该方法。你可以这样做:

public void onEnable(){
  plugin = this;
  Handler.setup();
}

但是这个:

public void onEnable(){
  Handler.setup();
  plugin = this;
}

答案 1 :(得分:-1)

你必须重新发明Singleton Pattern

(len > 40)

您现在可以直接访问实例,而无需在public class MainClass extends JavaPlugin { private static MainClass instance; public MainClass() { instance = this; } public static MainClass getInstance() { return instance; } @Override public void onEnable() { Listener listener = new ListenerClass(); } } 中创建成员变量。

ListenerClass