SPIGOT:调用非静态方法而不重新初始化插件

SPIGOT: Calling a non-static method without re-initializing the plugin

在过去的 4 天里,我一直在研究并试图解决这个问题。遗憾的是,由于与我的问题相关的文档不足和缺乏社区支持,我最终决定求助于 Whosebug。

这是我的问题,每个 Java 程序员都知道或应该知道,你基本上永远不应该使用 static 变量、classes、方法等正确? 好吧,似乎每次我尝试从外部 class 调用方法时(通过启动存储非静态方法的 main class 的新实例),Spigot 抛出一个 java.lang.IllegalArgumentException: 插件已经初始化!错误!

所以这是我的问题,如何从所述 class(来自外部 class)中获取主要 class 和 运行 方法的实例,不触发此错误?正如我所说,我已经在互联网上搜索,试图找到这个问题的答案。 时代之父https://bukkit.org/threads/how-do-you-refer-to-a-non-static-method.69920/

在这里发布了我得到的最合乎逻辑的答案

我已经更改了 时间之父 给出的答案以满足我的需要(我尝试访问的方法位于我的主要 class 作为反对其他一些 class) 这是我当前适用的代码:

主要Class

public final class MainClass extends JavaPlugin implements Listener {
    private static final MainClass mainClass = new MainClass();

...

    public MainClass() {}

    public static MainClass getMainClass()
    {
        return mainClass;
    }

    private void exampleMethod() {
    }

...

}

中学Class

import com.example.namespace.MainClass;

...

public class CommandClass implements CommandExecutor {

...
    @Override
    public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {

         MainClass.getMainClass().exampleMethod()

    }

...

}

时间之父 的描述背后的原因是我们不会将 class 本身或其任何 variables/methods 设为静态。相反,只需使用静态 getter 获取 class 的实例。 关于这一切的一切看起来都应该有效(它也编译得很好)。

我是 Java 的新手,老实说,很多与跨 class 交流相关的东西让我难以理解。需要明确的是,这只是我制作实验性插件来帮助自己学习语言(我通过做而不是仅仅阅读哈哈来学得更快)。我已经知道让静态变得疯狂是一种不好的做法,这就是为什么我如此沮丧,以至于即使我正在努力做正确的事情,我也无法在互联网上找到一个有效的答案!

如有help/constructive批评,不胜感激!我希望最终能够开始为 Minecraft 编写很棒的插件,但我需要先适应 Java 环境。

好吧,我什至无法开始说我是多么的生气,但也松了一口气,我花了半个小时写完我的问题后才弄明白 XD 由@Sweeper 在评论中所说的提示。我 运行 另一个 google 搜索。我发现了这个 link:

https://www.spigotmc.org/threads/best-method-for-getting-instance-of-main-class.365480/

我立即能够替换我的代码并让一切正常工作!正如我所说,我在这个领域仍然很菜鸟,对我来说,当我在我的 MainClass 中添加 new MainClass() 行时,我看到那是我调用 class' 实例。所以我从来没有想过我没有这样做。

当 Sweeper 说“我要你展示如何以及在何处创建 CommandClass 的实例”时,我说,“等等,我以为 X 是我获取实例的”,因此我搜索了一下更多并得出结论,我是......一个白痴。

作为一个简单的问题,我简直不敢相信它困扰了我这么久!谢谢 Sweeper 间接回答了我的问题! :D