我正在尝试访问主类的变量。问题是我想让我的代码完全模块化,以便我可以构建它并创建一个库。我遇到的问题是,为了访问变量,我必须使用主类的名称:
// this is in the main class which we will call "MyPlugin"
public class MyPlugin extends JavaPlugin {
public static String compath = "CommandFileName";
@Override
public void onEnable() {
this.getServer().getPluginManager().registerEvents(new MyListener(this), this);
}
}
// this is in the listener class which we will call "MyListener"
public MyListener(Plugin instance) {
Plugin plugin = instance;
path = MyPlugin.compath; // <-- the problem...
我的第一个想法是我应该能够做到这一点:
path = plugin.compath;
但是由于某种原因,插件对象不包含compath变量。 有没有办法在不使用名称的情况下访问主类的变量?
对于那些想要围绕这个目的思考的人来说,现在更加深入了解。 MyListener将引用yml类型的配置文件。无论出于何种原因,配置yml文件中的密钥名称将来可能会有所不同。我的想法是将名称放在主类中,以便MyListener可以引用它们。这种方法可以更加集中化名称列表,并防止将来对多个类进行大量更改。
答案 0 :(得分:1)
简单的答案是在JavaPlugin
API中声明一个getter。
您在初始设计中做了两件事情,使您的任务变得复杂:您已经变量static
并且您已将其变为public
。这两个都是糟糕的OO设计:
无论如何,这就是我实现这个的方法:
public abstract class MyPluginBase extends JavaPlugin {
public abstract String getCompath();
....
}
public class MyPlugin extends MyPluginBase {
@Override
public String getCompath() {
return "CommandFileName";
}
@Override
public void onEnable() {
this.getServer().getPluginManager().registerEvents(
new MyListener(this), this);
}
}
public MyListener(MyPluginBase instance) {
path = instance.getCompath();
...
}
答案 1 :(得分:0)
将其作为参数传递:
public MyListener(Plugin instance, String path) {
Plugin plugin = instance;
this.path = path; // <-- the problem...
}
public class MyPlugin extends JavaPlugin {
public static String compath = "CommandFileName";
@Override
public void onEnable() {
this.getServer().getPluginManager().registerEvents(new MyListener(this, compath), this);
}
}
答案 2 :(得分:0)
我想你想要
public MyListener(MyPlugin instance) {
MyPlugin plugin = instance;
path = plugin.compath;
问题是您使用的是Plugin
而不是MyPlugin