item 89 jihoon - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki
[item89] ์ธ์คํด์ค ์๋ฅผ ํต์ ํด์ผ ํ๋ค๋ฉด readResolve ๋ณด๋ค๋ ์ด๊ฑฐ ํ์ ์ ์ฌ์ฉํ๋ผ
์ฑ๊ธํด ํด๋์ค
// ์์ฑ์ ํธ์ถ์ ๋ง์ ์ธ์คํด์ค๊ฐ ์ค์ง ํ๋๋ง ๋ง๋ค์ด์ง์ ๋ณด์ฅ
public class Elvis {
public static final Elvis INSTANCE = new Elvis();
private Elvis() { ... }
public void leaveTheBuilding() { ... }
}
-
์ด ํด๋์ค์ implements Serializable์ ์ถ๊ฐํ๋ ์๊ฐ ๋ ์ด์ ์ฑ๊ธํด์ด ์๋๊ฒ ๋๋ค.
- ์ปค์คํ ์ง๋ ฌํ๋ ๋ช ์์ readObject๋ฅผ ์ ๊ณตํ๋๋ผ๋ ์์ฉ์๋ค.
-
์ด๋ค readObject๋ฅผ ์ฌ์ฉํ๋ ์ด ํด๋์ค๊ฐ ์ด๊ธฐํ๋ ๋ ๋ง๋ค์ด์ง ์ธ์คํด์ค์๋ ๋ณ๊ฐ์ธ ์ธ์คํด์ค๊ฐ ๋ฆฌํด๋๋ค.
-
readResolve ๊ธฐ๋ฅ์ ์ด์ฉํ๋ฉด readObject๊ฐ ๋ง๋ค์ด๋ด ์ธ์คํด์ค๋ฅผ ๋ค๋ฅธ ๊ฒ์ผ๋ก ๋์ฒดํ ์ ์๋ค.
Serialaizable์ ๊ตฌํํ ์ฑ๊ธํด ํด๋์ค์ readResolve ์ ์ฉ
public class Elvis implements Serializable {
public static final Elvis INSTANCE = new Elvis();
private Elvis() { ... }
public void leaveTheBuilding() { ... }
// ์ง์ง Elvis๋ฅผ ๋ฆฌํดํ๊ณ , ๊ฐ์ง Elvis๋ ๊ฐ๋น์ง ์ปฌ๋ ํฐ์ ๋งก๊ธด๋ค.
private Object readResolve() {
return INSTANCE;
}
}
- ์ญ์ง๋ ฌํํ ๊ฐ์ฒด์ ํด๋์ค๊ฐ readResolve ๋ฉ์๋๋ฅผ ์ ์ํด ๋๋ค๋ฉด, ์ญ์ง๋ ฌํ ํ ์๋ก ์์ฑ๋ ๊ฐ์ฒด๋ฅผ ์ธ์๋ก ์ด ๋ฉ์๋๊ฐ ํธ์ถ๋๊ณ , ์ด ๋ฉ์๋๊ฐ ๋ฆฌํดํ ๊ฐ์ฒด ์ฐธ์กฐ๊ฐ ์๋ก ์์ฑ๋ ๊ฐ์ฒด๋ฅผ ๋์ ํด ๋ฆฌํด๋๋ค.
- readResolve๋ฅผ ์ธ์คํด์ค ํต์ ๋ชฉ์ ์ผ๋ก ์ฌ์ฉํ๋ค๋ฉด ํด๋์ค ๋ด๋ถ์ ๊ฐ์ฒด ์ฐธ์กฐ ํ์
์ธ์คํด์ค ํ๋๋ ์ง๋ ฌํ๋ ํ์๊ฐ ์์ผ๋ฏ๋ก transient๋ฅผ ์ ์ธํด์ผ ํ๋ค.
- ์ฑ๊ธํด์์ readResolve ๋ฉ์๋๊ฐ ์ต์ด ์์ฑ๋ ์ธ์คํด์ค๋ฅผ ๋ฆฌํดํ๊ฒ ๋ง๋ค์ด readObject ๋ฉ์๋๊ฐ ๋ง๋ค์ด๋ธ ์๋ก์ด ์ธ์คํด์ค๊ฐ ํ์ ์๊ณ , ์ธ์คํด์ค ๋ณ์ ์ญ์ ์ง๋ ฌํํ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ด๋ค.
public class Elvis implements Serializable {
public static final Elvis INSTANCE = new Elvis();
// ๊ฐ์ฒด ์ฐธ์กฐ ํ์
์ธ์คํด์ค ํ๋
private String[] favoriteSongs = {"Hound Dog", "Heartbreak Hotel"};
private Elvis() {
}
public void printFavorites() {
System.out.println(Arrays.toString(favoriteSongs));
}
private Object readResolve() {
return INSTANCE;
}
}
์ฑ๊ธํด์ ์์ ํ๋์ง๋ฆฌ ์ด๊ฑฐ ํ์ ์ผ๋ก ๊ตฌํ
public enum Elvis {
INSTANCE;
private String[] favoriteSongs = {"Hound Dog", "Heartbreak Hotel"};
public void printFavorites() {
System.out.println(Arrays.toString(favoriteSongs));
}
}
- ์ด๊ฑฐ ํ์ ์ฑ๊ธํด์ด ์ ํต์ ์ธ ์ฑ๊ธํด๋ณด๋ค ์ฐ์ํ๋ค.
- ์ง๋ ฌํ์ ์ธ์คํด์ค ํต์ ๊ฐ ๋ชจ๋ ํ์ํ ํด๋์ค๋ฅผ ์์ฑํด์ผ ํ๋๋ฐ, ์ปดํ์ผ ํ์๋ ์ด๋ค ์ธ์คํด์ค๋ค์ด ์๋์ง ์ ์ ์๋ ๊ฒฝ์ฐ ์ด๊ฑฐ ํ์ ์ผ๋ก ํํ ๋ถ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ readResolve๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
ํต์ฌ ์ ๋ฆฌ
- ๋ถ๋ณ์์ ํตํด ์ธ์คํด์ค๋ฅผ ํต์ ํด์ผ ํ๋ค๋ฉด ๊ฐ๋ฅํ ํ ์ด๊ฑฐ ํ์ ์ ์ฌ์ฉํ์
- ์ฌ์์น ์์ ์ํฉ์์ ์ง๋ ฌํ์ ์ธ์คํด์ค ํต์ ๊ฐ ๋ชจ๋ ํ์ํ๋ค๋ฉด readResolve ๋ฉ์๋๋ฅผ ์์ฑํด์ผ ํ๊ณ , ๊ทธ ํด๋์ค์์ ๋ชจ๋ ์ฐธ์กฐ ํ์ ์ธ์คํด์ค ํ๋๋ฅผ transient๋ก ์ ์ธํด์ผํ๋ค.