item 5 dodo4513 - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki

μ•„μ΄ν…œ5 μžμ›μ„ 직접 λͺ…μ‹œν•˜μ§€ 말고 의쑴 객체 μ£Όμž…μ„ μ‚¬μš©ν•˜λΌ.

  • λ§Žμ€ ν΄λž˜μŠ€λŠ” ν•˜λ‚˜ μ΄μƒμ˜ μžμ›μ— μ˜μ‘΄ν•œλ‹€.

정적 μœ ν‹Έλ¦¬ν‹°λ₯Ό 잘λͺ» μ‚¬μš©ν•œ 예: μœ μ—°ν•˜μ§€ μ•Šκ³  ν…ŒμŠ€νŠΈν•˜κΈ° μ–΄λ ΅λ‹€.

public class SpellChecker {

    private static final Lexicon dictionary = ...;

    private SpellChecker() {} // 객체 생성 방지

    public static boolean isValid(String word) {...}

    public static List<String> suggestions(String typo) {...}
}
  • ν•˜λ‚˜μ˜ μ‚¬μ „λ§Œ μ‚¬μš©ν•œλ‹€κ³  κ°€μ •ν•œλ‹€λŠ” μ μ—μ„œ(private static final을 μ‚¬μš©) 그리 ν›Œλ₯­ν•΄ 보이지 μ•Šλ‹€.
  • λ‹¨μˆœνžˆ dictionary의 final을 μ œκ±°ν•˜κ³  setter λ“±μœΌλ‘œ 사전을 κ΅μ²΄ν•˜λŠ” 방법도 μžˆκ² μ§€λ§Œ, μ΄λŠ” μ–΄μƒ‰ν•˜κ³  였λ₯˜λ₯Ό λ‚΄κΈ° μ‰¬μš°λ©° λ©€ν‹°μŠ€λ ˆλ“œ ν™˜κ²½μ—μ„œλŠ” μ“Έ 수 μ—†λ‹€.
  • 즉 μ‚¬μš©ν•˜λŠ” μžμ›μ— 따라 λ™μž‘μ΄ λ‹¬λΌμ§€λŠ” ν΄λž˜μŠ€μ—λŠ” 정적 μœ ν‹Έλ¦¬ν‹° ν΄λž˜μŠ€λ‚˜ μ‹±κΈ€ν„΄ 방식이 μ ν•©ν•˜μ§€ μ•Šλ‹€.

ν•΄κ²°μ±…: μΈμŠ€ν„΄μŠ€λ₯Ό 생성할 λ•Œ μƒμ„±μžμ— ν•„μš”ν•œ μžμ›μ„ λ„˜κ²¨μ£ΌλŠ” 방식

public class SpellChecker {

    private final Lexicon dictionary;

    public SpellChecker(Lexicon dictionary) {
        this.dictionary = Objects.requireNonNull(dictionary);
    }

    public boolean isValid(String word) {...}

    public List<String> suggestions(String typo) {...}
}
  • 의쑴 객체 μ£Όμž…μ˜ ν•œ ν˜•νƒœλ‘œ, λ§žμΆ€λ²• 검사기λ₯Ό 생성할 λ•Œ 의쑴 객체인 사전을 μ£Όμž…ν•΄μ£Όλ©΄ λœλ‹€
  • μœ„ μ˜ˆμ—μ„œλŠ” dictionaryλΌλŠ” λ”± ν•˜λ‚˜μ˜ μžμ›λ§Œ μ‚¬μš©ν•˜μ§€λ§Œ, μžμ›μ΄ λͺ‡ κ°œλ“  의쑴 관계가 μ–΄λ–»λ“  상관없이 잘 μž‘λ™ν•œλ‹€. 또 ν•œ λΆˆλ³€μ„ 보μž₯ν•˜μ—¬ (같은 μžμ›μ„ μ‚¬μš©ν•˜λ €λŠ”) μ—¬λŸ¬ ν΄λΌμ΄μ–ΈνŠΈκ°€ 의쑴 객체듀을 μ•ˆμ‹¬ν•˜κ³  κ³΅μœ ν•  수 μžˆκΈ°λ„ ν•˜λ‹€. 의쑴 객체 μ£Όμž…μ€ μƒμ„±μž, 정적 νŒ©ν„°λ¦¬, λΉŒλ” λͺ¨λ‘μ— λ˜‘κ°™μ΄ μ‘μš©ν•  수 μžˆλ‹€.

νŒ¨ν„΄μ˜ μ“Έλ§Œν•œ λ³€ν˜•μœΌλ‘œ, μƒμ„±μžμ— μžμ› νŒ©ν„°λ¦¬λ₯Ό λ„˜κ²¨μ£ΌλŠ” 방식도 μžˆλ‹€

Mosaic create(Supplier<? extends Tile> tileFactory) {...}
  • νŒ©ν„°λ¦¬λž€ ν˜ΈμΆœν•  λ•Œλ§ˆλ‹€ νŠΉμ • νƒ€μž…μ˜ μΈμŠ€ν„΄μŠ€λ₯Ό λ°˜λ³΅ν•΄μ„œ λ§Œλ“€μ–΄μ£ΌλŠ” 객체λ₯Ό λ§ν•œλ‹€. 즉, νŒ©ν„°λ¦¬ λ©”μ„œλ“œ νŒ¨ν„΄(Factory Method pattern)[Gamma95]을 κ΅¬ν˜„ν•œ 것이닀.
  • μžλ°” 8μ—μ„œ μ†Œκ°œν•œ Supplier μΈν„°νŽ˜μ΄μŠ€κ°€ νŒ©ν„°λ¦¬λ₯Ό ν‘œν˜„ν•œ μ™„λ²½ν•œ μ˜ˆλ‹€. Supplierλ₯Ό μž…λ ₯으둜 λ°›λŠ” λ©”μ„œλ“œλŠ” 일반적으둜 ν•œμ •μ  μ™€μΌλ“œμΉ΄λ“œ νƒ€μž…(bounded wildcard type)을 μ‚¬μš©ν•΄ νŒ©ν„°λ¦¬μ˜ νƒ€μž… λ§€κ°œλ³€μˆ˜λ₯Ό μ œν•œν•΄μ•Ό ν•œλ‹€.

핡심정리

ν΄λž˜μŠ€κ°€ λ‚΄λΆ€μ μœΌλ‘œ ν•˜λ‚˜ μ΄μƒμ˜ μžμ›μ— μ˜μ‘΄ν•˜κ³ , κ·Έ μžμ›μ΄ 클래슀 λ™μž‘μ— 영ν–₯을 μ€€λ‹€λ©΄ μ‹±κΈ€ν„΄κ³Ό 정적 μœ ν‹Έλ¦¬ν‹° ν΄λž˜μŠ€λŠ” μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” 것이 μ’‹λ‹€. 이 μžμ›λ“€μ„ ν΄λž˜μŠ€κ°€ 직접 λ§Œλ“€κ²Œ ν•΄μ„œλ„ μ•ˆ λœλ‹€. λŒ€μ‹  ν•„μš”ν•œ μžμ›μ„ (ν˜Ήμ€ κ·Έ μžμ›μ„ λ§Œλ“€μ–΄μ£ΌλŠ” νŒ©ν„°λ¦¬λ₯Ό) μƒμ„±μžμ— (ν˜Ήμ€ 정적 νŒ©ν„°λ¦¬λ‚˜ λΉŒλ”μ—) λ„˜κ²¨μ£Όμž. 의쑴 객체 μ£Όμž…μ΄λΌ ν•˜λŠ” 이 기법은 클래슀의 μœ μ—°μ„±, μž¬μ‚¬μš©μ„±, ν…ŒμŠ€νŠΈ μš©μ΄μ„±μ„ κΈ°λ§‰νžˆκ²Œ κ°œμ„ ν•΄μ€€λ‹€.

끝

유λͺ…ν•œ DI에 λŒ€ν•œ λ‚΄μš©!

⚠️ **GitHub.com Fallback** ⚠️