私の質問は非常に基本的なものですが、すべてを 100% 理解したいと思っています。SO の多くの質問は私の投稿を参照していますが、満足のいく答えが見つかりません。
Java の Enum は参照型であることはわかっています。次のスニペットを考えてみましょう。
public static class A {
public int i;
public A(int i) {
this.i = i;
}
}
public static class Test {
int i;
A a;
public Test(int i, A a){
this.i = i;
this.a = a;
}
public Test(Test oldTest){
this.i = oldTest.i;
this.a = oldTest.a;
}
}
public static void main(String[] args) {
Test t1 = new Test(10, new A(100));
System.out.println(t1.i + " " + t1.a.i);
Test t2 = new Test(t1);
t2.i = 200;
t2.a.i = 3983;
System.out.println(t2.i + " " + t2.a.i);
System.out.println(t1.i + " " + t1.a.i);
}
Test のコピー コンストラクターが浅いコピーを作成するため、出力は非常に明白です。
10 100
200 3983
10 3983
しかし、Javaの列挙型も参照型であるため、1つ理解できません。A クラスを Enum に置き換えましょう。
public static enum TestEnum {
ONE, TWO, THREE;
}
public static class Test {
int i;
TestEnum enumValue;
public Test(int i, TestEnum enumVar){
this.i = i;
this.enumValue = enumVar;
}
public Test(Test oldTest){
this.i = oldTest.i;
this.enumValue = oldTest.enumValue; // WHY IT IS OK ??
}
}
public static void main(String[] args) {
Test t1 = new Test(10, TestEnum.ONE);
System.out.println(t1.i + " " + t1.enumValue);
Test t2 = new Test(t1);
t2.i = 200;
t2.enumValue = TestEnum.THREE; // why t1.emunValue != t2.enumValue ??
System.out.println(t2.i + " " + t2.enumValue);
System.out.println(t1.i + " " + t1.enumValue);
}
私は出力を期待していました:
10 ONE
200 THREE
10 THREE <--- I thought that reference has been copied... not value
しかし、私は持っています:
10 ONE
200 THREE
10 ONE
質問: なぜですか? 私の考えはどこが間違っていますか?