【问题标题】:why assign an enum instance to the other enum, when I change the value of enum, it doesn't effect to the other为什么将枚举实例分配给另一个枚举,当我更改枚举的值时,它不会影响另一个
【发布时间】: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 无效。 为什么?如果我希望它发生,我该如何更改我的代码?

【问题讨论】:

  • 不清楚你在这里问什么:这就是引用的工作方式。你知道innerClassinnerClass2 指的是同一个实例,所以如果你在打印innerClass2 之后打印innerClass,你会看到相同的输出。
  • 如果您删除了问题中与问题无关的代码,也会有所帮助。例如,InnerClass 以及依赖它的所有内容都与enum1enum2 变量的行为无关。

标签: java enums


【解决方案1】:

只需将枚举类型变量想象为原始类型变量。我认为所有原始类型变量都有有限数量的状态。

在您的情况下,请考虑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());
    }
}

【讨论】:

  • 非常感谢。这就是我所要求的。太好了。
猜你喜欢
  • 2021-10-21
  • 2015-04-06
  • 1970-01-01
  • 1970-01-01
  • 2010-12-22
  • 2019-01-29
  • 1970-01-01
  • 1970-01-01
  • 2014-10-09
相关资源
最近更新 更多