зачем назначать экземпляр enum другому перечислению, когда я изменяю значение enum, это не влияет на другое - PullRequest
0 голосов
/ 30 сентября 2018

Поскольку тип enum представляет собой набор именованных значений, я хочу использовать его в качестве состояний конечного автомата.

Однако, когда я назначаю один экземпляр enum другому и изменяю значение предыдущего экземпляра, я ожидаю, что другой экземпляр enum имеет ту же ссылку, но это не так, и, как результат, изменение значенияне вступает в силу с другой (более поздней).

Мне интересно, почему?и как я могу реализовать эту логику с помощью типа enum?

Вот мой пример кода.

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: test string, i: 1, целое число: 1
A
str: новая тестовая строка, i: 2, целое число: 2
A
B

Очевидно, вы можете видеть, что изменение enum1 не влияетперечислить2.Зачем?и если я хочу, чтобы это произошло, как я могу изменить свой код?

1 Ответ

0 голосов
/ 30 сентября 2018

Просто представьте переменную типа enum типа переменной типа примитива.Я бы сказал, что все переменные примитивного типа имеют конечное число состояний.

В вашем случае подумайте TestEnum как, например, int type.
Когда вы присваиваете значение переменной *Тип 1006 *, это все равно что присвоить числовое значение переменной типа 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, * 1012.* и innerClass2 переменные, и хранить переменную и ее состояние в таком объекте.

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());
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...