gpt4 book ai didi

java - 在Java中,如何动态访问主类?

转载 作者:行者123 更新时间:2023-12-01 10:09:15 24 4
gpt4 key购买 nike

我正在尝试访问主类的变量。问题是我想让我的代码完全模块化,以便我可以在它的基础上构建并创建一个库。我遇到的问题是,为了访问变量,我必须使用主类的名称,如下所示:

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

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