item 3 dodo4513 - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki
μμ΄ν 3 private μμ±μλ μ΄κ±° νμ μΌλ‘ μ±κΈν΄μμ 보μ¦νλΌ
μ±κΈν΄?
- μ±κΈν΄(singleton)μ΄λ μΈμ€ν΄μ€λ₯Ό μ€μ§ νλλ§ μμ±ν μ μλ ν΄λμ€λ₯Ό λ§νλ€.
- μ±κΈν΄μ μ νμ μΈ μλ‘λ ν¨μμ κ°μ 무μν(stateless) κ°μ²΄λ μ€κ³μ μ μΌν΄μΌ νλ μμ€ν μ»΄ν¬λνΈλ₯Ό λ€ μ μλ€.
- ν΄λμ€λ₯Ό μ±κΈν΄μΌλ‘ λ§λ€λ©΄ μ΄λ₯Ό μ¬μ©νλ ν΄λΌμ΄μΈνΈλ₯Ό ν μ€νΈνκΈ°κ° μ΄λ €μμ§ μ μλ€. νμ μ μΈν°νμ΄μ€λ‘ μ μν λ€μ κ·Έ μΈν°νμ΄μ€λ₯Ό ꡬνν΄μ λ§λ μ±κΈν΄μ΄ μλλΌλ©΄ μ±κΈν΄ μΈμ€ν΄μ€λ₯Ό κ°μ§(mock) ꡬνμΌλ‘ λ체ν μ μκΈ° λλ¬Έμ΄λ€.
μ±κΈν΄μ λ§λλ λ°©μ
public static final νλ λ°©μμ μ±κΈν΄
public class Elvis {
public static final Elvis INSTANCE = new Elvis();
private Elvis() {...}
}
-
private μμ±μλ public static final νλμΈ Elvis.INSTANCEλ₯Ό μ΄κΈ°νν λ λ± ν λ²λ§ νΈμΆλλ€. publicμ΄λ protected μμ±μκ° μμΌλ―λ‘ Elvis ν΄λμ€κ° μ΄κΈ°νλ λ λ§λ€μ΄μ§ μΈμ€ν΄μ€κ° μ 체 μμ€ν μμ νλλΏμμ΄ λ³΄μ₯λλ€.
-
μμΈλ λ¨ ν κ°μ§, κΆνμ΄ μλ ν΄λΌμ΄μΈνΈλ 리νλ μ API(μμ΄ν 65)μΈ AccessibleObject.setAccessibleμ μ¬μ©ν΄ private μμ±μλ₯Ό νΈμΆν μ μλ€. μ΄λ¬ν 곡격μ λ°©μ΄νλ €λ©΄ μμ±μλ₯Ό μμ νμ¬ λ λ²μ§Έ κ°μ²΄κ° μμ±λλ € ν λ μμΈλ₯Ό λμ§κ² νλ©΄ λλ€.
-
public νλ λ°©μμ ν° μ₯μ μ ν΄λΉ ν΄λμ€κ° μ±κΈν΄μμ΄ APIμ λͺ λ°±ν λλ¬λλ€λ κ²μ΄λ€. public static νλκ° finalμ΄λ μ λλ‘ λ€λ₯Έ κ°μ²΄λ₯Ό μ°Έμ‘°ν μ μλ€. λ λ²μ§Έ μ₯μ μ λ°λ‘ κ°κ²°ν¨μ΄λ€.
μ μ ν©ν°λ¦¬ λ°©μμ μ±κΈν΄
public class Elvis {
private static final Elvis INSTANCE = new Elvis();
private Elvis() {...}
public static Elvis getInstance() { return INSTANCE; }
}
- Elvis.getInstanceλ νμ κ°μ κ°μ²΄μ μ°Έμ‘°λ₯Ό λ°ννλ―λ‘ μ 2μ Elvis μΈμ€ν΄μ€λ κ²°μ½ λ§λ€μ΄μ§μ§ μλλ€(μμ 리νλ μ μ ν΅ν μμΈλ λκ°μ΄ μ μ©λλ€).
- μ μ ν©ν°λ¦¬ λ°©μμ 첫 λ²μ§Έ μ₯μ μ (λ§μμ΄ λ°λλ©΄) APIλ₯Ό λ°κΎΈμ§ μκ³ λ μ±κΈν΄μ΄ μλκ² λ³κ²½ν μ μλ€λ μ μ΄λ€. μ μΌν μΈμ€ν΄μ€λ₯Ό λ°ννλ ν©ν°λ¦¬ λ©μλκ° (μ컨λ) νΈμΆνλ μ€λ λλ³λ‘ λ€λ₯Έ μΈμ€ν΄μ€λ₯Ό λκ²¨μ£Όκ² ν μ μλ€.
- λ λ²μ§Έ μ₯μ μ μνλ€λ©΄ μ μ ν©ν°λ¦¬λ₯Ό μ λ€λ¦ μ±κΈν΄ ν©ν°λ¦¬λ‘ λ§λ€ μ μλ€λ μ μ΄λ€(μμ΄ν 30).
- μΈ λ²μ§Έ μ₯μ μ μ μ ν©ν°λ¦¬μ λ©μλ μ°Έμ‘°λ₯Ό 곡κΈμ(supplier)λ‘ μ¬μ©ν μ μλ€λ μ μ΄λ€.
- μ μ₯μ λ€μ΄ κ΅³μ΄ νμνμ§ μλ€λ©΄ public νλ λ°©μμ΄ μ’λ€.
μ΄κ±° νμ λ°©μμ μ±κΈν΄: λ°λμ§ν λ°©λ²
public enum Elvis {
INSTANCE;
}
- public νλ λ°©μκ³Ό λΉμ·νμ§λ§, λ κ°κ²°νκ³ , μΆκ° λ Έλ ₯ μμ΄ μ§λ ¬νν μ μκ³ , μ¬μ§μ΄ μμ£Ό 볡μ‘ν μ§λ ¬ν μν©μ΄λ 리νλ μ 곡격μμλ μ 2μ μΈμ€ν΄μ€κ° μκΈ°λ μΌμ μλ²½ν λ§μμ€λ€. μ‘°κΈ λΆμμ°μ€λ¬μ λ³΄μΌ μλ μμΌλ λλΆλΆ μν©μμλ μμκ° νλλΏμΈ μ΄κ±° νμ μ΄ μ±κΈν΄μ λ§λλ κ°μ₯ μ’μ λ°©λ²μ΄λ€.
- λ§λ€λ €λ μ±κΈν΄μ΄ Enum μΈμ ν΄λμ€λ₯Ό μμν΄μΌ νλ€λ©΄ μ΄ λ°©λ²μ μ¬μ©ν μ μλ€.