You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java创建Test类静态实例及枚举关联后toString结果异常咨询

嘿,我来帮你拆解这个问题的根源,还有对应的解决办法!

问题到底出在哪?

核心问题完全出在Test类的变量设计上:你用了**静态变量instance**来存储每个对象的初始化值,但静态变量是属于整个Test类的,所有Test实例都会共享这同一个变量。

当Test类被JVM加载时,三个静态常量test1、test2、test3会按顺序初始化:

  • 先创建test1,构造函数把静态instance设为"a"
  • 接着创建test2,构造函数直接把静态instance覆盖成了"b"
  • 最后创建test3,构造函数又把静态instance改成了"c"

所以不管你引用的是test1、test2还是test3,它们指向的静态instance最终值都是"c"。当你在枚举里调用enumtest.toString()时,如果你的toString方法是返回这个静态instance,自然会得到和预期不符的结果。

怎么解决?

要让每个Test实例保存自己独有的初始化值,只需要把静态变量改成实例变量就行,具体代码调整如下:

public class Test {
    public static final Test test1 = new Test("a");
    public static final Test test2 = new Test("b");
    public static final Test test3 = new Test("c");
    
    // 改成实例变量,每个对象都有自己的副本,加final保证不可修改
    private final String instance;

    public Test(String init) {
        this.instance = init; // 给当前实例的变量赋值,不再修改静态变量
    }

    // 重写toString方法,返回当前实例的专属值
    @Override
    public String toString() {
        return instance;
    }
    // ...其他业务代码
}

这么改完之后:

  • 每个Test对象都有自己独立的instance值,再也不会被其他对象覆盖
  • 枚举里的enumtest = Test.test1调用toString()时,会返回test1自己的"a",完全符合你的预期

另外,把instance设为private并加final,还能保证数据的封装性和不可变性,避免后续代码不小心修改这个值引发新问题。

内容的提问来源于stack exchange,提问作者FishingIsLife

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:34:19