为什么将一个枚举实例分配给另一个枚举,当我更改枚举的值时,它不会影响另一个

时间:2018-09-30 08:33:23

标签: java enums

因为枚举类型是一组命名值,所以我想将其用作状态机的状态。

但是,当我将一个枚举实例分配给另一个枚举实例并更改前一个实例的值时,我希望另一个枚举实例具有相同的引用,但是没有,因此更改值不会花费对另一个(后一个)的效果。

我想知道为什么吗?以及如何使用枚举类型使这种逻辑发生?

这是我的示例代码。

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
A
str:新的测试字符串,i:2,整数:2
A
B

很显然,您可以看到将enum1更改为enum2无效。 为什么?如果我希望发生这种情况,该如何更改代码?

1 个答案:

答案 0 :(得分:0)

只需将枚举类型变量类型视为原始类型变量即可。我认为所有原始类型变量都具有有限数量的状态。

在您的情况下,请考虑使用TestEnum,例如int类型。
TestEnum类型的变量分配值时,就像为int类型的变量分配数字值一样。

// this defines 2 'buckets' in memory storing states of 2 variables
TestEnum a = TestEnum.A, b = TestEnum.B;
// this simply copies a state of variable b into variable a
// a and b are NOT pointers to the memory!
a = b;
// following simply replaces a state of variable b
// it has nothing to do with variable a
b = TestEnum.C;
// at that point a is TestEnum.B
// b has TestEnum.C value

如果要保留对某些值/变量的许多“引用”并通过访问它们中的任何一个来更改它们的状态,只需遵循与使用InnerClass类型,innerClassinnerClass2变量,并将变量及其状态存储在此类对象中。

public class Test {
    public enum TestEnum {
        A, B, C
    }

    public static class InnerClass {
        private TestEnum testEnum;

        private InnerClass(TestEnum testEnum) {
            this.testEnum = testEnum;
        }

        public TestEnum getTestEnum() {
            return testEnum;
        }

        public void setTestEnum(TestEnum testEnum) {
            this.testEnum = testEnum;
        }

        @Override
        public String toString() {
            return "testEnum: " + testEnum;
        }
    }

    public static void main(String[] args) {
        InnerClass innerClass = new InnerClass(TestEnum.A);
        System.out.println(innerClass.toString());

        InnerClass innerClass2 = innerClass;

        innerClass.setTestEnum( TestEnum.B );

        System.out.println(innerClass2.toString());
    }
}