【发布时间】:2018-09-30 08:33:23
【问题描述】:
因为枚举类型是一组命名值,我想将它用作状态机的状态。
但是,当我将一个枚举实例分配给另一个枚举实例并更改前一个实例的值时,我希望另一个枚举实例具有相同的引用,但事实并非如此,因此,值更改不会占用影响另一个(后一个)。
我想知道为什么?我怎样才能通过使用枚举类型来实现这个逻辑?
这是我的示例代码。
public class Test {
public enum TestEnum {
A, B, C
}
public static class InnerClass {
private String str;
private int i;
private Integer integer;
private InnerClass(String s, int i, Integer integer) {
this.str = s;
this.i = i;
this.integer = integer;
}
public String getStr() {
return str;
}
public void setStr(String str) {
this.str = str;
}
public int getI() {
return i;
}
public void setI(int i) {
this.i = i;
}
public int getInteger() {
return integer;
}
public void setInteger(Integer i) {
this.integer = i;
}
@Override
public String toString() {
return "str: " + str + ", i: " + i + ", integer: " + integer;
}
}
public static void main(String[] args) {
InnerClass innerClass = new InnerClass("test string", 1, 1);
TestEnum enum1 = TestEnum.A;
System.out.println(innerClass.toString());
System.out.println(enum1);
InnerClass innerClass2 = innerClass;
TestEnum enum2 = enum1;
innerClass.setStr("new test string");
innerClass.setI(2);
innerClass.setInteger(2);
enum1 = TestEnum.B;
System.out.println(innerClass2.toString());
System.out.println(enum2);
System.out.println(enum1);
}
}
输出是:
str:测试字符串,i:1,整数:1
一个
str:新的测试字符串,i:2,整数:2
一个
乙
显然,您可以看到将 enum1 更改为 enum2 无效。 为什么?如果我希望它发生,我该如何更改我的代码?
【问题讨论】:
-
不清楚你在这里问什么:这就是引用的工作方式。你知道
innerClass和innerClass2指的是同一个实例,所以如果你在打印innerClass2之后打印innerClass,你会看到相同的输出。 -
如果您删除了问题中与问题无关的代码,也会有所帮助。例如,
InnerClass以及依赖它的所有内容都与enum1和enum2变量的行为无关。