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
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
-
0. TL;DR 📚
readResolve()
작성하고, 클래스의 모든 참조 타입 인스턴스 필드를transient
키워드를 이용하자.1. 인스턴스 수의 통제
인스턴스 수를 통제하는 기법은 바로
싱글턴
이다.그리고
직렬화
와싱글턴
은 상성이 맞지 않다.바로
implement Serializable
을 추가하는 순간 싱글턴이 아니게 되기 때문이다.기본 직렬화를 쓰지 않더라도 (아이템 87)
명시적인
readObject()
(아이템88) 를 제공하더라도 소용없다.어떤
readObject()
를 사용하든 이 클래스가 초기화될 때 만들어진 인스턴스와는 별개의 인스턴스를 반환하기 때문이다.2. readResolve()
readObject()
가 별개의 인스턴스를 반환하기만을 마냥 기다릴 수 없다.readResolve()
를 가용하여 필연적으로 원본의 Instance를 반환하게 지시할 수 있다.이때 만약에 싱글턴 클래스의 필드가 존재한다면, 해당 필드는 반드시 모두다
transient
키워드를 추가해야한다.readResolve()
가 수행되기전에 역 직렬화된 객체의 참조를 공격할 여지가 남는다.2.1 deep To
readResolve()
readResolve()와 도둑 클래스
3. 싱글턴과 열거 타입
직렬화 가능한 인스턴스 통제 클래스를 열거 타입을 이용해 구현하면, 선언한 상수 외의 다른 객체가 존재하지 않는다는것을
자바
가 보증한다.native 코드
까지 조작한다면 이는 완전하지 않을 수 있다.readResolve()는 완전히 쓸모 없어진것이 아니다.
3.1 readResolve()와 접근제어자
정리하자면 반드시 하위 클래스에서는 readResolve()를 정의해야 한다는 것이다!
4. 핵심 정리 📚
readResolve()
보다 적다.5. 회고 🧹
2023-04-23 (일)
Beta Was this translation helpful? Give feedback.
All reactions