我正在尝试访问主类的变量。问题是我想让我的代码完全模块化,以便我可以在它的基础上构建并创建一个库。我遇到的问题是,为了访问变量,我必须使用主类的名称,如下所示:
// 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 文件中的 key 名称将来可能会有所不同。我的想法是将名称放在主类中,以便 MyListener 可以引用它们。这种方法将使名称列表更加集中,并防止将来对多个类进行大量更改。
最佳答案
简单的答案是在 JavaPlugin
API 中声明一个 getter。
您在初始设计中所做的两件事使您的任务变得复杂:您将变量设置为静态
,并将其设置为公共(public)
。这两种都是糟糕的 OO 设计:
- 静态变量不利于可测试性,并且不能多态地使用(或者用您的话说“动态”)。
- 公共(public)变量不利于抽象。 (尤其是非最终版本!)
无论如何,这就是我实现这个的方式:
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();
...
}
关于java - 在Java中,如何动态访问主类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36244904/