You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
싱글톤과 같이 불변식을 지키기 위해 인스턴스를 통제해야 한다면 가능한 열거 타입을 사용하자. 여의치 않은 상황에서 직렬화와 인스턴스 통제가 모두 필요하다면 readResolve 메서드를 작성해 넣고, 그 클래스에서 모든 참조 타입 인스턴스 필드를 transient로 선언해야한다.
transient 필드를 선언하고 readResolve 메소드를 구현해서 싱글톤이 깨지는 것을 막을 수 있지만, 사실 원소 하나짜리 enum으로 바꾸는 것이 더 나은 선택이다. (꽤 손이 많이 간다) 만약 컴파일 타임에 어떤 인스턴스가 있는지 알 수 없다면 enum보다는 readResolve를 구현하는 것이 낫다.
깨지는 싱글턴
생성자를 숨기는 싱글톤은 직렬화를 사용하는 순간 더 이상 싱글톤이 아니게 된다.
readResolve로 싱글턴 깨지는 것 막기
non transient 필드 공격
readResolve를 인스턴스 통제 목적으로 사용한다면, 객체 참조 타입 인스턴스 필드는 모두 transient로 선언해야 한다. 그렇지 않으면 readResolve가 수행되기 전에 역직렬화된 객체의 참조를 공격할 여지가 남는다.
역직렬화 공격방식
열거 타입 싱글턴
transient 필드를 선언하고 readResolve 메소드를 구현해서 싱글톤이 깨지는 것을 막을 수 있지만, 사실 원소 하나짜리 enum으로 바꾸는 것이 더 나은 선택이다. (꽤 손이 많이 간다) 만약 컴파일 타임에 어떤 인스턴스가 있는지 알 수 없다면 enum보다는 readResolve를 구현하는 것이 낫다.
readResolve의 접근성
The text was updated successfully, but these errors were encountered: