item 3 leekyunghee - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki
-
์ฑ๊ธํด
์ด๋ ์ธ์คํด์ค๋ฅผ ์ค์ง ํ๋๋ง ์์ฑํ ์ ์๋ ํด๋์ค -
ํจ์
์ ๊ฐ์ ๋ฌด์ํ ๊ฐ์ฒด๋ ์ค๊ณ์ ์ ์ผํด์ผ ํ๋ ์์คํ ์ปดํฌ๋ํธ๋ฅผ ์์๋ก ๋ค ์ ์๋ค.
ํด๋์ค๋ฅผ ์ฑ๊ธํด์ผ๋ก ๋ง๋ค ๊ฒฝ์ฐ ์ด๋ฅผ ์ฌ์ฉํ๋ ๊ณณ์์ ํ ์คํธ๋ฅผ ํ๊ธฐ ์ด๋ ค์์ง ์ ์๋ค.
ํ์ ์ ์ธํฐํ์ด์ค๋ก ์ ์ํ ๋ค์ ๊ทธ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํด์ ๋ง๋ ์ฑ๊ธํด์ด ์๋๋ผ๋ฉด ์ฑ๊ธํด ์ธ์คํด์ค๋ฅผ mock ๊ตฌํ์ผ๋ก ๋์ฒดํ ์ ์๋ค.
public class Elvis {
public static final Elvis INSTANCE = new Elvis();
private Elvis() {....}
public void leaveTheBuilding() {....}
}
private ์์ฑ์๋ public static final ํ๋์ธ Elvis.INSTANCE๋ฅผ ์ด๊ธฐํํ ๋ ๋ฑ ํ๋ฒ๋ง ํธ์ถ๋๋ค.
public ์ด๋ protected ์์ฑ์๊ฐ ์์ผ๋ฏ๋ก Elvis ํด๋์ค๊ฐ ์ด๊ธฐํ๋ ๋ ๋ง๋ค์ด์ง ์ธ์คํด์ค๊ฐ ์ ์ฒด ์์คํ ์์ ํ๋๋ฟ์์ด ๋ณด์ฅ๋๋ค.
- ์์ธ๋ ๋จ ํ๊ฐ์ง ๊ถํ์ด ์๋ ํด๋ผ์ด์ธํธ๋ ๋ฆฌํ๋ ์ API(์์ดํ 65)์ธ AccessibleObject.setAccessible์ ์ฌ์ฉํด private ์์ฑ์๋ฅผ ํธ์ถํ ์ ์๋ค.
- ์ด๋ฌํ ๊ณต๊ฒฉ์ ๋ฐฉ์ดํ๋ ค๋ฉด ์์ฑ์๋ฅผ ์์ ํ์ฌ ๋ ๋ฒ์งธ ๊ฐ์ฒด๊ฐ ์์ฑ๋๋ ค ํ ๋ ์์ธ๋ฅผ ๋์ง๊ฒ ํ๋ฉด๋๋ค.
- public ํ๋ ๋ฐฉ์์ ํฐ ์ฅ์ ์ ํด๋น ํด๋์ค๊ฐ ์ฑ๊ธํด์์ด API์ ๋ช ๋ฐฑํ ๋๋ฌ๋๋ค๋ ๊ฒ์ด๋ค.
- public static ํ๋๊ฐ final์ด๋ ์ ๋๋ก ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ ์ ์๋ค.
- ๊ฐ๊ฒฐํจ
public class Elvis {
public static final Elvis INSTANCE = new Elvis();
private Elvis() {....}
public static Elvis getInstance() { return INSTANCE; }
public void leaveTheBuilding() { ... }
}
- Elvis.getInstance๋ ํญ์ ๊ฐ์ ๊ฐ์ฒด์ ์ฐธ์กฐ๋ฅผ ๋ฐํํ๋ฏ๋ก ์ 2์ Elvis ์ธ์คํด์ค๋ ๊ฒฐ์ฝ ๋ง๋ค์ด์ง์ง ์๋ค.
- API๋ฅผ ๋ฐ๊พธ์ง ์๊ณ ๋ ์ฑ๊ธํด์ด ์๋๊ฒ ๋ณ๊ฒฝํ ์ ์๋ค.
์ ์ผํ ์ธ์คํด์ค๋ฅผ ๋ฐํํ๋ ํฉํ ๋ฆฌ ๋ฉ์๋๊ฐ ํธ์ถํ๋ ์ค๋ ๋๋ณ๋ก ๋ค๋ฅธ ์ธ์คํด์ค๋ฅผ ๋๊ฒจ์ฃผ๊ฒ ํ ์ ์๋ค.
- ์ํ๋ค๋ฉด ์ ์ ํฉํ ๋ฆฌ๋ฅผ ์ ๋ค๋ฆญ ์ฑ๊ธํด ํฉํ ๋ฆฌ๋ก ๋ง๋ค ์ ์๋ค.
- ์ ์ ํฉํ ๋ฆฌ ๋ฉ์๋ ์ฐธ์กฐ๋ฅผ ๊ณต๊ธ์(supplier)๋ก ์ฌ์ฉํ ์ ์๋ค.
Elvis::getInstance๋ฅผ Supplier๋ก ์ฌ์ฉํ๋ ์์ด๋ค. (์์ดํ 43, 44)
-
๋๋ฐฉ์ ๋ชจ๋ ์์ฑ์๋ private์ผ๋ก ๊ฐ์ถฐ๋๊ณ ์ ์ผํ ์ธ์คํด์ค์ ์ ๊ทผํ ์ ์๋ ์๋จ์ผ๋ก public static ๋ฉค๋ฒ๋ฅผ ํ๋ ๋ง๋ จํด๋๋ค.
-
๋์ค ํ๋์ ๋ฐฉ์์ผ๋ก ๋ง๋ ์ฑ๊ธํด ํด๋์ค๋ฅผ ์ง๋ ฌํํ๋ ค๋ฉด ๋จ์ํ Serializable์ ๊ตฌํํ๋ค๊ณ ํด์ ์ ์ธํ๋ ๊ฒ๋ง์ผ๋ก๋ ๋ถ์กฑํ๋ค.
๋ชจ๋ ์ธ์คํด์ค ํ๋๋ฅผ ์ผ์์ ์ด๋ผ๊ณ ์ ์ธํ๊ณ readResolve ๋ฉ์๋๋ฅผ ์ ๊ณตํด์ผํ๋ค. (์์ดํ 89)
์ด๋ ๊ฒ ํ์ง ์์ผ๋ฉด ์ง๋ ฌํ๋ ์ธ์คํด์ค๋ฅผ ์ญ์ง๋ ฌํํ ๋๋ง๋ค ์๋ก์ด ์ธ์คํด์ค๊ฐ ๋ง๋ค์ด์ง๋ค. - ๊ฐ์ง Elvis๊ฐ ํ์
๊ฐ์ง Elvis ํ์์ ์๋ฐฉํ๊ณ ์ถ๋ค๋ฉด Elvis ํด๋์ค์ ๋ค์ readResolve ๋ฉ์๋๋ฅผ ์ถ๊ฐํ์.
// ์ฑ๊ธํด์์ ๋ณด์ฅํด์ฃผ๋ readResolve ๋ฉ์๋
private Object readResolve() {
// ์ง์ง Elvis๋ฅผ ๋ฐํํ๊ณ ๊ฐ์ง Elvis๋ ๊ฐ๋น์ง ์ปฌ๋ ํฐ์ ๋งก๊ธด๋ค.
return INSTANCE;
}
public enum Elvis {
INSTANCE;
pulblic void leaveTheBuilding() { ... }
}
- public ํ๋ ๋ฐฉ์๊ณผ ๋น์ทํ์ง๋ง ๋ ๊ฐ๊ฒฐํ๊ณ ์ถ๊ฐ ๋ ธ๋ ฅ์์ด ์ง๋ ฌํํ ์ ์๋ค.
- ๋ณต์กํ ์ง๋ ฌํ ์ํฉ์ด๋ ๋ฆฌํ๋ ์ ๊ณต๊ฒฉ์์๋ ์ 2์ ์ธ์คํด์ค๊ฐ ์๊ธฐ๋ ์ผ์ ์๋ฒฝํ ๋ง์์ค๋ค.
- ์์๊ฐ ํ๋๋ฟ์ธ ์ด๊ฑฐ ํ์ ์ด ์ฑ๊ธํด์ ๋ง๋๋ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ด๋ค.
ํต์ฌ ์ ๋ฆฌ
์ด๊ฑฐ ํ์
๋ฐฉ์์ ์ฑ๊ธํด์ ๋ง๋๋๊ฒ ๊ฐ์ฅ ๋ฐ๋์งํ ๋ฐฉ๋ฒ์ด๋ค.
๋จ ๋ง๋ค๋ ค๋ ์ฑ๊ธํด์ด Enum ์ธ์ ํด๋์ค๋ฅผ ์์ํด์ผ ํ๋ค๋ฉด ์ด ์ด ๋ฐฉ๋ฒ์ ์ฌ์ฉํ ์ ์๋ค.
- ์ด๊ฑฐ ํ์
์ด ๋ค๋ฅธ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋๋ก ์ ์ธ ํ ์๋ ์๋ค.