๐ ์ฑ๊ธํด(Singleton)
์ธ์คํด์ค๋ฅผ ์ค์ง ํ๋๋ง ์์ฑํ ์ ์๋ ํด๋์ค
ํจ์์ ๊ฐ์ ๋ฌด์ํ(stateless) ๊ฐ์ฒด๋ ์ค๊ณ์ ์ ์ผํด์ผ ํ๋ ์์คํ ์ปดํฌ๋ํธ ๋ฑ
๋จ์
- ํด๋ผ์ด์ธํธ ํ ์คํธ๊ฐ ์ฉ์ดํ์ง ์๋ค. ํด๋์ค๋ฅผ ์ฑ๊ธํด์ผ๋ก ๋ง๋ค๋ฉด ํ์ ์ ์ธํฐํ์ด์ค๋ก ๋ง๋ค๊ณ ๊ทธ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํด์ ๋ง๋ ์ฑ๊ธํด์ด ์๋ ๊ฒฝ์ฐ ์ฑ๊ธํด ์ธ์คํด์ค๋ฅผ ๊ฐ์ง(mock) ๊ตฌํ์ผ๋ก ๋์ฒดํ ์ ์๊ธฐ ๋๋ฌธ
๐ ์ฑ๊ธํด์ ์ ๋ ฅํ๋ ๋ฐฉ์
๋ ๋ฐฉ์ ๋ชจ๋ ์์ฑ์๋ private์ผ๋ก ๊ฐ์ถฐ๋๊ณ , ์ ์ผํ ์ธ์คํด์ค์ ์ ๊ทผํ ์ ์๋ ์๋จ์ผ๋ก public static ๋ฉค๋ฒ๋ฅผ ๋ง๋ จํ๋ค.
♦๏ธ public static final ํ๋ ๋ฐฉ์์ ์ฑ๊ธํด
private ์์ฑ์๋ public static final ํ๋์ธ Elvis.INSTANCE๋ฅผ ์ด๊ธฐํ ํ ๋ ๋ฑ ํ ๋ฒ ํธ์ถ๋๋ค.
์์ฑ์๊ฐ private์ด๋ฏ๋ก ์ด ์ธ์คํด์ค๊ฐ ์ ์ฒด ์์คํ ์์ ํ๋๋ฟ์์ด ๋ณด์ฅ๋๋ค.
/** PublicStaticFinal.java */
public class Elvis {
public static final Elvis INSTANCE = new Elvis();
private Elvis() {}
public void leaveTheBuilding() {}
}
์ฅ์
- ํด๋น ํด๋์ค๊ฐ ์ฑ๊ธํด์์ด API์ ๋ช ๋ฐฑํ ๋๋ฌ๋๋ค.
- ๊ฐ๊ฒฐํ๋ค.
♦๏ธ ์ ์ ํฉํฐ๋ฆฌ ๋ฐฉ์
INSTANCE๋ฅผ ๋ฐํํ๋ public static ๋ฉ์๋ getInstance()๋ฅผ ์ฌ์ฉํ๋ค.
์๋์ ์ฅ์ ๋ค์ด ํ์ํ ๊ฒฝ์ฐ๊ฐ ์๋๋ผ๋ฉด public ํ๋ ๋ฐฉ์์ด ๋ซ๋ค...
/** StaticFactory.java */
public class Elvis2 {
private static final Elvis2 INSTANCE = new Elvis2();
private Elvis2() {}
public static Elvis2 getInstance() { return INSTANCE; }
public void leaveTheBuilding() {}
}
์ฅ์
- ๋ง์์ด ๋ฐ๋๋ฉด API๋ฅผ ๋ฐ๊พธ์ง ์๊ณ ๋ ์ฑ๊ธํด์ด ์๋๊ฒ ๋ณ๊ฒฝํ ์ ์๋ค.
- ์ํ๋ค๋ฉด ์ ์ ํฉํฐ๋ฆฌ๋ฅผ ์ ๋ค๋ฆญ ์ฑ๊ธํด ํฉํฐ๋ฆฌ๋ก ๋ง๋ค ์ ์๋ค.
- ์ ์ ํฉํฐ๋ฆฌ์ ๋ฉ์๋ ์ฐธ์กฐ๋ฅผ ๊ณต๊ธ์๋ก ์ฌ์ฉํ ์ ์๋ค.
- ex) Elvis::getInstance๋ฅผ Supplier<Elvis>
♦๏ธ ๋ฆฌํ๋ ์ API
๊ถํ์ด ์๋ ํด๋ผ์ด์ธํธ๋ ๋ฆฌํ๋ ์ API์ธ AccessibleObject.setAccessible์ ์ฌ์ฉํด private ์์ฑ์๋ฅผ ํธ์ถํ ์ ์์ผ๋ฏ๋ก ๋ฐฉ์ดํ๊ธฐ ์ํ ์ฝ๋๊ฐ ํ์ํ๋ค.
๊ฒฐ๋ก
enum ๋ฐฉ์์ด ์งฑ์ด๋ค. ??
'reviews > Effective JAVA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
007. ๋ค ์ด ๊ฐ์ฒด ์ฐธ์กฐ๋ฅผ ํด์ ํ๋ผ (0) | 2022.03.09 |
---|---|
006. ๋ถํ์ํ ๊ฐ์ฒด ์์ฑ์ ํผํด๋ผ (0) | 2022.03.04 |
005. ์์์ ์ง์ ๋ช ์ํ์ง ๋ง๊ณ ์์กด ๊ฐ์ฒด ์ฃผ์ ์ ์ฌ์ฉํ๋ผ (0) | 2022.02.25 |
004. ์ธ์คํด์คํ๋ฅผ ๋ง์ผ๋ ค๊ฑฐ๋ private ์์ฑ์๋ฅผ ์ฌ์ฉํ๋ผ (0) | 2022.02.25 |
002. ์์ฑ์์ ๋งค๊ฐ๋ณ์๊ฐ ๋ง๋ค๋ฉด ๋น๋๋ฅผ ๊ณ ๋ คํ๋ผ (0) | 2022.02.20 |