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
相关产品推荐
相关产品推荐

