Item 89. Enum for Instance Control
์ธ์คํด์ค ์๋ฅผ ํต์ ํด์ผ ํ๋ค๋ฉด readResolve๋ณด๋ค๋ ์ด๊ฑฐ ํ์ ์ ์ฌ์ฉํ๋ผ
์์ฑ์๋ฅผ ํธ์ถํ์ง ๋ชปํ๊ฒ ๋ง๋ ๋ฐฉ์์ผ๋ก ์ธ์คํด์ค๊ฐ ํ๋๋ง ๋ง๋ค์ด์ง์ ๋ณด์ฅํ ์ ์๋ค.
public class SingletonClass {
private static final SingletonClass INSTANCE = new SingletonClass();
private SingletonClass() {
// ...
}
// ...
}
ํ์ง๋ง ํด๋์ค ์ ์ธ์ implements Serializable
์ ์ถ๊ฐํ๋ฉด ์ง๋ ฌํ๋ฅผ ํตํ ๊ฐ์ฒด ์์ฑ์ด ๊ฐ๋ฅํด์ง๋ฉด์ ๋ ์ด์ ์ฑ๊ธํด์ด ์๋๊ฒ ๋๋ค.
readResolve
๋ฅผ ์ด์ฉํ ํด๊ฒฐ ๋ฐฉ๋ฒ
readResolve
๋ฅผ ์ด์ฉํ ํด๊ฒฐ ๋ฐฉ๋ฒreadResolve
๊ธฐ๋ฅ์ ์ด์ฉํ์ฌ readObject
๊ฐ ๋ฐํํ๋ ์ธ์คํด์ค๋ฅผ ๋ค๋ฅธ ๊ฒ์ผ๋ก ๋์ฒดํ๋ ๋ฐฉ์์ผ๋ก ํด๊ฒฐํด๋ณผ ์ ์๋ค.
public class SingletonClass implements Serializable {
private static final SingletonClass INSTANCE = new SingletonClass();
private transient SomeField someField; // ์ง๋ ฌํ ํํ์์ ์๋ฌด๋ฐ ์ค ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง ํ์๊ฐ ์์ผ๋ ๋ชจ๋ ํ๋๋ฅผ transient๋ก ์ ์ธ
private SingletonClass() {
// ...
}
public static SingletonClass getInstance() {
return INSTANCE;
}
// ์ญ์ง๋ ฌํ๋ ๊ฐ์ฒด๋ฅผ ๋์ ํ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ ์ญํ ์ ์ํํ๋ ๋ฉ์๋
private Object readResolve() {
// ์ง์ง ์ธ์คํด์ค๋ฅผ ๋ฐํํ๊ณ , ์ญ์ง๋ ฌํ ์ค ์๊ธด ์ธ์คํด์ค๋ GC์์ ์ ๊ฑฐ๋๋๋ก ํจ
return INSTANCE;
}
}
readResolve
๋ฉ์๋ ๊ตฌํ ๋ฐ transient
์ ์ธ์ ํตํด ํด๊ฒฐํ ์ ์๋๋ฐ, ๊ฐ๊ฐ์ ๊ตฌํ์ ์๋์ ์ญํ ์ ํ๊ฒ ๋๋ค.
readResolve
๋ฉ์๋ ๊ตฌํ: ์ญ์ง๋ ฌํ๋ ๊ฐ์ฒด๋ฅผ ๋์ ํ ๊ฐ์ฒด๋ฅผ ๋ฐํํ์ฌ ์ญ์ง๋ ฌํํ์ฌ ์๊ธด ๊ฐ์ฒด ์ ๊ทผ ๋ฐฉ์ง๋ชจ๋ ํ๋๋ฅผ
transient
์ ์ธ: ์ผ๋ฐ ์ฐธ์กฐ ํ๋๊ฐ ์๋ค๋ฉด ํด๋น ํ๋์ ๋ด์ฉ์readResolve
๋ฉ์๋๊ฐ ์ํ๋๊ธฐ ์ ์ ์ญ์ง๋ ฌํ๊ฐ ์ํ๋๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ๋ฐฉ์ง
์ด๊ฑฐ ํ์
์ ์ฌ์ฉํ์ฌ ๋ ์ฝ๊ฒ ํด๊ฒฐํ ์ ์์ง๋ง, ์๋์ ์ํฉ์์ readResolve
๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๊ณ ๋ คํด๋ณด๋ ๊ฒ๋ ์ข๋ค.
์ง๋ ฌํ ๊ฐ๋ฅ ์ธ์คํด์ค ํต์ ํด๋์ค๋ฅผ ์์ฑํด์ผํ์ง๋ง, ์ปดํ์ผํ์์๋ ์ด๋ค ์ธ์คํด์ค๋ค์ด ์๋์ง ์ ์ ์๋ ์ํฉ
์ด๊ฑฐ ํ์
์ ์ฌ์ฉํ ํด๊ฒฐ ๋ฐฉ๋ฒ
readResolve
๊ตฌํ๊ณผ transient
์ ์ธ์ ํตํด ํด๊ฒฐํ ์ ์์ง๋ง ์ ๊ฒฝ์ ๋ง์ด ์จ์ผํ๋ ์์
์ธ๋ฐ, ์ด๊ฑฐ ํ์
์ ์ฌ์ฉํ๋ฉด ์ด๋ฌํ ์์
์ ๊ฐ๋จํ๊ฒ ํด๊ฒฐํ ์ ์๋ค.
public enum SingletonEnum {
INSTANCE; // ์ ์ธํ ์์ ์ธ์ ๋ค๋ฅธ ๊ฐ์ฒด๋ ์กด์ฌํ์ง ์์์ ์๋ฐ๊ฐ ๋ณด์ฅ
// ...
}
Last updated
Was this helpful?