繁体   English   中英

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

[英]How do I pass instances of the main class to multiple listeners?

所以,我一直在研究一个插件。 它很棒,直到我偶然发现了一个问题。 我正在使用单独的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
    }
}

我做了一些与大多数人不同的事情。 假设您extends JavaPlugin的类是Main.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;
}

你必须重新发明Singleton模式

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创建成员变量。

public class ListenerClass implements Listener {
    public ListenerClass() {
        Plugin main = MainClass.getInstance();
        main.getServer().getPluginManager().registerEvents(this, main);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM