⚠️주의⚠️: 해당 문서는 역자의 능력 부족으로 인해 의역이 많이 들어갔습니다. Contribution을 환영합니다.
문서에 따르면,
value-based class
에서 같은 값을 가리키는 두개의 참조 객체를 다르게 구분한다면, 예상치 못한 문제가 발생할 수 있습니다. 특히, 그런 상황에서 synchronization 하거나 hash 값으로 동등성을 체크하려 한다거나, 직렬화 하려할 때 등에 문제가 발생합니다.
예를들면, Foo를 value-based class
라고 생각해주세요.
Foo[] arr = new Foo[2];
arr[0] = new Foo(0);
arr[1] = new Foo(0);
이는 arr을 직렬화(Serialization)한 결과를, 역직렬화하면 element 0과 1이 같은 참조를 갖고 있지 않을 것입니다.
Foo[] arr = new Foo[2];
arr[0] = new Foo(0);
arr[1] = arr[0];
반면 위 코드에서 arr을 직렬화(Serialization)한 결과를, 역직렬화하면 element 0과 1은 같은 참조를 갖을 것입니다.
이러한 약속은 현재 Java 구현에서 동시에 충족되지만, 미래에도 그럴 것이라고 보장할 수 없습니다. 특히 진정한 의미의 value type이 java 언어에 도입된다면, 위 약속은 깨질 수 있습니다.
이 규칙은 Serializable
클래스가 non-transient 하거나 non-static 한, 이미 알려진 value-based class
를 필드값으로 갖고 있는 경우 경종을 울립니다.
이미 알려진 value-based class
는 다음과 같습니다.
-
java.time
패키지 내의Clock
을 제외한 모든 클래스 - 캘린더의 대인이 될 수 있는 Date 클래스:
HijraDate
,JapaneseDate
,MinguDate
,ThaiBuddistDate
규칙을 어긴 코드
class MyClass implements Serializable {
private HijrahDate date; // 규칙을 어긴 코드: transient를 사용합시다
// ...
}
규칙을 준수한 해결책
class MyClass implements Serializable {
private transient HijrahDate date;
// ...
}
같이보면 좋은 자료
-
Value-based classes
java.util.Optional
andjava.time.LocalDateTime
같은 클래스를 보고 Value-based class 라고 부릅니다.
If you like SONARKUBE, don’t forget to give me a star.