java - 不能在 onEnable() 中使用成员变量

标签 java multithreading

我有一个公开课,在那个课上我有:

Msg msg = new Msg();

但是我无法从类的 public void 方法访问 msg

如果我:

  • 每次使用时,将 Msg msg = new Msg(); 放在 msg 之前。
  • 改为执行 new Msg().log("")

如果我尝试它不起作用:

private static Msg msg = new Msg();
public static Msg msg = new Msg();

我在控制台中得到的错误是:

java.lang.NoClassDefFoundError: enji/lep/Msg at enji.lep.chat.Chat.<init>(Chat.java:16)

相关代码如下:

import java.util.logging.Logger;

import org.bukkit.plugin.java.JavaPlugin;

/* Created by enji */

public class Chat extends JavaPlugin {

    Logger log = Logger.getLogger("Minecraft");
    Msg msg = new Msg();

    @Override
    public void onEnable() {
        msg.log("Talliban bajs i simskolans sovrum!!!!"); // This causes the error
    }

    @Override
    public void onDisable() {
        log.info("Plugin off");
    }

}

最佳答案

您的代码不是线程安全的。 奇怪data race如果 Chat 对象在一个线程中创建(并且其成员 msg 分别被初始化)是可能的,但是方法 Chat#onEnable() (其中使用那个 msg 成员)从另一个线程调用。

考虑到上述情况,例如可以声明msg final:

private final Msg msg = new Msg();

“就地”创建新实例也是安全的(这就是它在您测试时起作用的原因):

new Msg().log("");

据我所知,上面的内容也会使 Chat 中的 msg 成员变得多余,因此您可以简单地删除它。

另一种选择是将 Msg.log 方法转换为静态方法并通过类而不是实例调用它:

  1. Msgstatic 中声明 log 方法。
  2. Msg.log("") 代替 msg.log("") 调用。
  3. 去掉 Msg msg = new Msg(); 因为它不再需要了。

看一个例子:

class Msg {
    public static void log(String msg) {
        // ...
    }
}

关于java - 不能在 onEnable() 中使用成员变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7892029/

相关文章:

java - 您如何对需要很长时间的方法进行单元测试?

java - 比 SQLite for Java 更好的嵌入式数据库

java - 设计一个带有统计数据的程序

java - 带有 Apache CXF 和自定义 header 的 WebService

java - 当在不同的类中使用时,我的PrintWriter的值变得无效

multithreading - 以下无锁代码是否表现出竞争条件?

java - Java Spring Async性能

c++ - 独立、操作系统无关、架构中立、多线程库

java - Jackson Web Servlet 线程安全吗?

c# - 从单独的线程访问表单的控件