Singleton์ด๋ ์ธ์คํด์ค๋ฅผ ์ค์ง ํ๋๋ง ์์ฑํ ์ ์๋ ํด๋์ค์ด๋ค. ํ์ง๋ง ํด๋์ค๋ฅผ ์ฑ๊ธํด์ผ๋ก ๋ง๋ค๋ฉด ์ด๋ฅผ ์ฌ์ฉํ๋ ํด๋ผ์ด์ธํธ๋ฅผ ํ ์คํธํ๊ธฐ ์ด๋ ค์์ง ์ ์๋ค. ์๋ํ๋ฉด ์ฑ๊ธํด ์ธ์คํด์ค๋ฅผ mocking ํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
์ฑ๊ธํค์ ๋ง๋๋ ๋ฐฉ์์ ๋ณดํต 2๊ฐ์ง๊ฐ ์กด์ฌํ๋ค.
public class Elvis {
public static final Elvis INSTANCE = new Elvis();
private Elvis() {}
public void someMethod() {}
}private ๊ธฐ๋ณธ ์์ฑ์ Elvis()๋ public static final ํ๋(Elvis.INSTANCE)๋ฅผ ์ด๊ธฐํํ ๋ ๋ฑ ํ๋ฒ๋ง ํธ์ถ๋๋ค. ์ด๋ก์จ Elvis ํด๋์ค๊ฐ ์ ์ฒด ์์คํ ์์ ์ค์ง ํ๋๋ฟ์์ ๋ณด์ฅํ ์ ์๋ค.
๋ค๋ง reflection์ ํ์ฉํ์ฌ ์ธ๋ถ์์ ํด๋์ค์ private ๋ฉ์๋๋ฅผ ํธ์ถํ๋ ๋ฐฉ๋ฒ(๊ณต๊ฒฉ)์ด ์กด์ฌํ๋ค. (AccessibleObject.setAccessible) ์ด ๊ณต๊ฒฉ์ ์ฌ์ ์ ๋ฐฉ์งํ๋ ค๋ฉด private ์์ฑ์๊ฐ ๋ ๋ฒ์งธ ํธ์ถ ๋๋ ์์ ์ ์์ธ๋ฅผ ๋์ง๊ฒ ํด์ผ ํ๋ค.
์ฅ์
ํด๋น ํด๋์ค๊ฐ ์ฑํดํด์ด๋ผ๋ ๊ฒ์ด API์ ๋ช ๋ฐฑํ ๋๋ฌ๋๋ฉฐ ๊ฐ๊ฒฐํ๋ค.
public class Elvis {
private static final Elvis INSTANCE = new Elvis();
private Elvis() {}
public static Elvis getInstance() { return INSTANCE; }
public void someMethod() {}
}Elvis.getInstance ๋ฉ์๋๋ ํญ์ ๋์ผํ ๊ฐ์ฒด INSTANCE๋ฅผ ๋ฐํํ๋ค.
์ฅ์
API๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ๋ ํด๋น ํด๋์ค๊ฐ ์ฑ๊ธํด์ด ์๋๊ฒ ๋ณ๊ฒฝํ ์ ์๋ค.
- ์ ์ผํ ์ธ์คํด์ค๋ฅผ ๋ฐํํ์ง ์๊ณ thread ๋ณ๋ก ๋ค๋ฅธ ์ธ์คํด์ค๋ฅผ ๋ฐํํ๋๋ก ์์ ํ ์ ์์
๋ํ ์ ์ ํฉํ ๋ฆฌ ๋ฉ์๋๋ฅผ generic singleton factory ๋ฉ์๋๋ก ๋ง๋ค ์ ์๋ค. ์ด๋ฌํ ์ฅ์ ์ ํ์ฉํ์ง ์๋๋ค๋ฉด, ์ฑ๊ธํค ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ธฐ ์ํด ์ ์ ํฉํ ๋ฆฌ ๋ฐฉ์๋ณด๋ค public static final ํ๋๋ฅผ ํ์ฉํ ๋ฐฉ์์ด ์ข๋ค.
์ฑ๊ธํค์ผ๋ก ๋ง๋ค ํด๋์ค๋ฅผ ์ง๋ ฌํํ๊ธฐ ์ํด ๋จ์ํ Serializable ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ค๊ณ ์ ์ธํ๋ ๊ฒ๋ง์ผ๋ก๋ ๋ถ์กฑํ๋ค. ๋ชจ๋ ์ธ์คํด์ค ํ๋๋ฅผ transient๋ก ์ ์ธํ๊ณ readResolve ๋ฉ์๋๋ฅผ ํตํด ์ฑ๊ธํด์์ ๋ณด์ฅํด์ผ ํ๋ค.
public enum Elvis {
INSTANCE;
public void someMethod() {}
}์ด๊ฑฐ ํ์ ์ ํตํด ์ฑ๊ธํด์ ๊ตฌํํ๋ฉด ์ง๋ ฌํ๋ฅผ ์ํ ์ถ๊ฐ์ ์ธ ์์ ์ด ํ์์๋ค. ๋ํ reflection์ ํตํ ์ 2์ ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ ๊ฒ์ ๋ง์ ์ ์๋ค. ๋๋ถ๋ถ์ ์ํฉ์์ ์์๊ฐ ํ๋๋ฟ์ธ ์ด๊ฑฐ ํ์ ์ผ๋ก ์ฑ๊ธํด์ ๋ง๋๋๊ฒ ๊ฐ์ฅ ๋ฐ๋์งํ๋ค.
- ๋จ, ๋ง๋๋ ค๋ ์ฑ๊ธํค ํด๋์ค๊ฐ ์ด๊ฑฐ ํ์ ์ด์ธ์ ํด๋์ค๋ฅผ ์์ํ๋ค๋ฉด ์ด ๋ฐฉ์์ผ๋ก ์ฑ๊ธํค ํด๋์ค๋ฅผ ๋ง๋ค ์ ์๋ค.