item 3 Jung inchul - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki
Effective Java 3e ์์ดํ 3๋ฅผ ์์ฝํ ๋ด์ฉ ์ ๋๋ค.
์ฑ๊ธํด(singleton)์ด๋ ์ธ์คํด์ค๋ฅผ ์ค์ง ํ๋๋ง ์์ฑํ ์ ์๋ ํด๋์ค๋ฅผ ๋งํ๋ค.
๊ทธ๋ฐ๋ฐ ํด๋์ค๋ฅผ ์ฑ๊ธํด์ผ๋ก ๋ง๋ค๋ฉด ์ด๋ฅผ ์ฌ์ฉํ๋ ํด๋ผ์ด์ธํธ๋ฅผ ํ ์คํธํ๊ธฐ๊ฐ ์ด๋ ค์์ง ์ ์๋ค.
Q1. ์ฑ๊ธํด์ ์ฌ์ฉํ๋ ํด๋ผ์ด์ธํธ ํ ์คํธ ํ๋ ๋ฐฉ๋ฒ์ ์ด๋ค๊ฒ๋ค์ด ์์๊น?
- mokito๋ฅผ ์ฌ์ฉํ์ฌ mockBean์ ์ฌ์ฉ
์ฑ๊ธํด์ ๋ง๋๋ ๋ฐฉ์์ ๋ณดํต ๋ ์ค ํ๋๋ค. ๋ ๋ฐฉ์ ๋ชจ๋ ์์ฑ์๋ private์ผ๋ก ๊ฐ์ถฐ๋๊ณ , ์ ์ผํ ์ธ์คํด์ค์ ์ ๊ทผํ ์ ์๋ ์๋จ์ผ๋ก public static ๋ฉค๋ฒ๋ฅผ ํ๋ ๋ง๋ จํด๋๋ค.
public class Elvis {
public static final Elvis INSTANCE = new Elvis();
private Elvis() { ... }
public void leaveThebuilding() { ... }
}
private ์์ฑ์๋ public static final ํ๋์ธ Elvis.INSTANCE๋ฅผ ์ด๊ธฐํํ ๋ ๋ฑ ํ ๋ฒ๋ง ํธ์ถ๋๋ค.
์์ธ๋ ๋จ ํ ๊ฐ์ง, ๊ถํ์ด ์๋ ํด๋ผ์ด์ธํธ๋ ๋ฆฌํ๋ ์ API์ธ AccessibleObject.setAccessible์ ์ฌ์ฉํด private์์ฑ์๋ฅผ ํธ์ถํ ์ ์๋ค. ์ด๋ฌํ ๊ณต๊ฒฉ์ ๋ฐฉ์ดํ๋ ค๋ฉด ์์ฑ์๋ฅผ ์์ ํ์ฌ ๋ ๋ฒ์งธ ๊ฐ์ฒด๊ฐ ์์ฑ๋๋ ค ํ ๋ ์์ธ๋ฅผ ๋์ง๊ฒ ํ๋ฉด ๋๋ค.
์ด๋ ๊ฒ ํ๋ฉด ์ด๋ค ์ฅ์ ์ด ์์๊น?
- public static ํ๋๊ฐ final์ด๋ ์ ๋๋ก ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ ์ ์๋ค.
- ๋ ๋ฒ์งธ ์ฅ์ ์ ๋ฐ๋ก ๊ฐ๊ฒฐํจ์ด๋ค.
Q2. ๋ฆฌํ๋ ์ API๋?
- ๋ฐํ์์ ๋ฉ๋ชจ๋ฆฌ์ ํ ๋น๋ ํด๋์ค์ ๋ด๋ถ๋ฅผ ๋ถ์ํ ์ ์๋๋ก ์ ๊ณตํ๋ API
- Field[] fields = bookClass.getDeclaredFields(); // ํด๋น ์ธ์คํด์ค์ ๋ฉ์๋๋ฅผ ์กฐํ
์ฑ๊ธํด์ ๋ง๋๋ ๋ ๋ฒ์งธ ๋ฐฉ๋ฒ์์๋ ์ ์ ํฉํฐ๋ฆฌ ๋ฉ์๋๋ฅผ public static ๋ฉค๋ฒ๋ก ์ ๊ณตํ๋ค.
public class Elvis {
private static final Elvis INSTANCE = new Elvis();
private Elvis() { ... }
public static Elvis getInstance() { return INSTANCE; }
public void leaveThebuilding() { ... }
}
Elvis.getInstance๋ ํญ์ ๊ฐ์ ๊ฐ์ฒด์ ์ฐธ์กฐ๋ฅผ ๋ฐํํ๋ฏ๋ก ์ 2์ Elvis ์ธ์คํด์ค๋ ๊ฒฐ์ฝ ๋ง๋ค์ด์ง์ง ์๋๋ค.
์ด๋ ๊ฒ ํ๋ฉด ์ด๋ค ์ฅ์ ์ด ์์๊น?
- API๋ฅผ ๋ฐ๊พธ์ง ์๊ณ ๋ ์ฑ๊ธํด์ด ์๋๊ฒ ๋ณ๊ฒฝํ ์ ์๋ค๋ ์ ์ด๋ค. (์ค๋ ๋๋ณ๋ก ๋ค๋ฅธ ์ธ์คํด์ค๋ฅผ ๋๊ฒจ์ฃผ๊ฒ ํ ์ ์๋ค)
- ์ํ๋ค๋ฉด ์ ์ ํฉํฐ๋ฆฌ๋ฅผ ์ ๋ค๋ฆญ ์ฑ๊ธํด ํฉํฐ๋ฆฌ๋ก ๋ง๋ค ์ ์๋ค.
- ์ ์ ํฉํฐ๋ฆฌ์ ๋ฉ์๋ ์ฐธ์กฐ๋ฅผ ๊ณต๊ธ์๋ก ์ฌ์ฉํ ์ ์๋ค.
์ฑ๊ธํด์ ๋ง๋๋ ์ธ ๋ฒ์งธ ๋ฐฉ๋ฒ์ ์์๊ฐ ํ๋์ธ ์ด๊ฑฐ ํ์ ์ ์ ์ธํ๋ ๊ฒ์ด๋ค.
private Object readResolve() {
return INSTANCE;
}
public enum Elvis {
INSTANCE;
public void leaveTheBuilding() { ... }
}
์กฐ๊ธ ๋ถ์์ฐ์ค๋ฌ์ ๋ณด์ผ ์๋ ์์ผ๋ ๋๋ถ๋ถ ์ํฉ์์๋ ์์๊ฐ ํ๋๋ฟ์ธ ์ด๊ฑฐ ํ์ ์ด ์ฑ๊ธํด์ ๋ง๋๋ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ด๋ค.
๋จ, ๋ง๋ค๋ ค๋ ์ฑ๊ธํด์ด Enum ์ธ์ ํด๋์ค๋ฅผ ์์ํด์ผ ํ๋ค๋ฉด ์ด ๋ฐฉ๋ฒ์ ์ฌ์ฉํ ์ ์๋ค.
Q3. ์ค๋ฌด์์ Enum์ผ๋ก ์ฑ๊ธํด์ ์์ฑํ๋ ๊ฒฝ์ฐ๊ฐ ์์๊น? ์ธ์ ๊ฐ ์ ํฉํ ๊น?