所以,我一直在研究一个插件。它很棒,直到我偶然发现了一个问题。我正在使用单独的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
}
}
答案 0 :(得分:4)
我做的事情与大多数人的做法截然不同。说你的班级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;
}
答案 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