gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:48:09 25 4
gpt4 key购买 nike

所以,我一直在开发一个插件。一切进展顺利,直到我偶然发现了一个问题。我使用单独的 Listener(implements Listener)类来管理我的事件,但对于其中一些事件,我需要访问 JavaPlugin 方法,例如获取配置文件。

在我的监听器类中使用下面 的构造函数是可行的,但是如果我尝试在另一个类中使用相同的东西,Eclipse 会给它一个可爱的红色下划线,说 blank final field plugin may还没有初始化

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

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

// 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;
}

关于java - 如何将主类的实例传递给多个监听器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23529640/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com