2023. 1. 9. 14:51γJAVA/Effective JAVA
μμ΄ν 3. private μμ±μλ μ΄κ±° νμ μΌλ‘ μ±κΈν€μμ 보μ¦νλΌ.
μ¬κΈ°μ private μμ±μ + public static final νλλ₯Ό μ¬μ©ν 첫λ²μ§Έ λ°©λ²μ λν΄μ μ€λͺ νλ€.
μ±κΈν€ singleton λ§λλ λ°©λ² 2
: private μμ±μ + μ μ ν©ν°λ¦¬ λ©μλ
λλ²μ§Έ μ±κΈν€μ λ§λλ λ°©λ²μΌλ‘λ μ μ ν©ν°λ¦¬ λ©μλλ₯Ό public staic λ©€λ²λ‘ μ 곡νλ κ²μ΄λ€.
public class Elvis
{
private static final Elvis INSTANCE = new Elvis();
private Elvis()
{
}
public static Elvis getInstance()
{
return INSTANCE; // return new Elvis();λ₯Ό νλ μκ° μ±κΈν€ μλκ²λ λ³κ²½ κ°λ₯
}
public void leaveTheBuilding()
{
System.out.println("Whoa baby, I'm outta here!");
}
}
Elvis.getInstanceλ νμ κ°μ κ°μ²΄μ μ°Έμ‘°λ₯Ό λ°ννκΈ° λλ¬Έμ μ 2μ Elvis μΈμ€ν΄μ€κ° λ§λ€μ΄μ§μ§ μλλ€!
(νμ§λ§ μμμμ λ¬Έμ μΈ λ¦¬νλ μ μ΄λ μμ§λ ¬νμ λν λ¬Έμ λ λμΌνκ² μΌμ΄λλ€.)
public static void main(String[] args)
{
Elvis elvis = Elvis.getInstance();
elvis.leaveTheBuilding();
System.out.println("Elvis.getInstance() = " + Elvis.getInstance());
System.out.println("Elvis.getInstance() = " + Elvis.getInstance());
}
-> κ°μ μΈμ€ν΄μ€κ° μΆλ ₯λλ€.
π’ private μμ±μ + public static final νλ λ°©λ² μ₯λ¨μ
μ₯μ
- APIλ₯Ό λ°κΎΈμ§ μκ³ λ μ±κΈν€μ΄ μλκ² λ³κ²½ν μ μλ€.
-> return INSTACNE λΆλΆλ§ new Elvis()λ‘ μλ‘μ΄ κ°μ²΄ μμ±μΌλ‘ λ³κ²½ν΄μ£Όλ©΄ λλ€.
- μ μ ν©ν°λ¦¬λ₯Ό μ λ€λ¦ μ±κΈν€ ν©ν°λ¦¬λ‘ λ§λ€ μ μλ€.
public class MetaElvis<T>
{
private static final MetaElvis<Object> INSTANCE = new MetaElvis();
private MetaElvis()
{
}
@SuppressWarnings("unchecked")
public static <T> MetaElvis<T> getInstance()
{
return (MetaElvis<T>) INSTANCE; // μνλ νμ
μΌλ‘ νλ³ν ν μ μλ€.
}
public void say(T t)
{
System.out.println("t = " + t);
}
public void leaveTheBuilding()
{
System.out.println("Whoa baby, I'm outta here!");
}
}
MetaElvis<String> metaElvis1 = MetaElvis.getInstance();
MetaElvis<Integer> metaElvis2 = MetaElvis.getInstance();
// == λΉκ΅λ μ λλ¦ νμ
μ΄ λ€λ₯΄κΈ° λλ¬Έμ == λ μλλ€.
System.out.println(
"(Objects.equals(metaElvis1, metaElvis2)) = " + (Objects.equals(metaElvis1, metaElvis2))); // ν΄μμ½λκ° κ°κ³ κ°μ μΈμ€ν΄μ€
-> ν μ€νΈ ν΄λ³΄λ©΄ metaElvis1κ³Ό metaElvis2λ ν΄μμ½λλ κ°μ μΈμ€ν΄μ€μ΄μ§λ§ μ λ€λ¦ νμ μ΄ λ€λ₯΄κΈ° λλ¬Έμ == λΉκ΅λ μλμ§λ§ Objects.equals()λ₯Ό ν΅ν΄ λΉκ΅ν΄λ³΄λ©΄ λμΌν κ²μ νμΈν μ μλ€.
- μ μ ν©ν°λ¦¬μ λ©μλ μ°Έμ‘°λ₯Ό 곡κΈμ Supplierλ‘ μ¬μ©ν μ μλ€.
public interface Singer
{
void sing();
}
public class Concert
{
public void start(Supplier<Singer> singerSupplier)
{
Singer singer = singerSupplier.get();
singer.sing();
}
}
// private μμ±μ + μ μ ν©ν°λ¦¬ λ©μλ
// μ₯μ : μ μ ν©ν°λ¦¬μ λ©μλ μ°Έμ‘°λ₯Ό supplierμ 곡κΈμλ‘ μ¬μ©ν μ μλ€λ μ
Concert concert = new Concert();
concert.start(Elvis::getInstance);
λ¨μ
- μ±κΈν€μ μ¬μ©νλ ν΄λΌμ΄μΈνΈλ₯Ό ν μ€νΈνκΈ° μ΄λ €μμ§λ€.
- 리νλ μ μΌλ‘ private μμ±μλ₯Ό νΈμΆν μ μλ€.
- μμ§λ ¬νλ₯Ό ν λ μλ‘μ΄ μΈμ€ν΄μ€κ° μκΈΈ μ μλ€.
μ±κΈν€ singleton λ§λλ λ°©λ² 3
: μ΄κ±° νμ
public enum Elvis
{
INSTANCE;
public void leaveTheBuilding()
{
System.out.println("Elvis.leaveTheBuilding");
}
}
μΈλ²μ§Έ λ°©λ²μΌλ‘λ μμκ° νλμΈ μ΄κ±° νμ μ μ μΈνλ κ²μ΄λ€.
μ΄ λ°©λ²μ μ¬μ©νλ©΄ public νλμ λΉμ·νμ§λ§ λ κ°κ²°νκ³ μΆκ° λ Έλ ₯ μμ΄ μ§λ ¬ν ν μ μμΌλ©°, 리νλ μ μν©μμλ μΈμ€ν΄μ€ μμ±μ μλ²½ν λ§μμ€λ€.
public static void main(String[] args)
{
Elvis elvis = Elvis.INSTANCE;
elvis.leaveTheBuilding();
}
λλΆλΆμ μν©μμλ μμκ° νλλΏμΈ μ΄κ±° νμ μ΄ μ±κΈν€μ λ§λλλ° κ°μ₯ μ’μ λ°©λ²μ΄λ€~_~
λ¨, λ§λ€λ €λ μ±κΈν΄μ΄ Enum μΈμ ν΄λμ€λ₯Ό μμν΄μΌ νλ€λ©΄ μ΄ λ°©λ²μ μ¬μ©ν μ μλ€.