ITEM 5: Dependency Injection

λ§Žμ€ ν΄λž˜μŠ€κ°€ ν•˜λ‚˜ μ΄μƒμ˜ μžμ›μ— μ˜μ‘΄ν•œλ‹€. μ΄λ•Œ μ‚¬μš©ν•˜λŠ” μžμ›μ— 따라 λ™μž‘μ΄ λ‹¬λΌμ§€λŠ” 클래슀(ν•˜λ‚˜ μ΄μƒμ˜ μžμ›μ— 의쑴)μ—λŠ” 정적 μœ ν‹Έλ¦¬ν‹° ν΄λž˜μŠ€λ‚˜ μ‹±κΈ€ν„΄ 방식이 μ ν•©ν•˜μ§€ μ•Šλ‹€.

μΈμŠ€ν„΄μŠ€λ₯Ό 생성할 λ•Œ μƒμ„±μžμ— ν•„μš”ν•œ μžμ›μ„ λ„˜κ²¨μ£ΌλŠ” 방식을 μ‚¬μš©ν•˜λ©΄, ν΄λž˜μŠ€κ°€ μ—¬λŸ¬ μžμ› μΈμŠ€ν„΄μŠ€λ₯Ό μ§€μ›ν•˜κ³ , ν΄λΌμ΄μ–ΈνŠΈκ°€ μ›ν•˜λŠ” μžμ›μ„ μ‚¬μš©ν•  수 μžˆλ‹€. 이 방법은 의쑴 객체 μ£Όμž…μ˜ ν•œ ν˜•νƒœλ‘œ μœ μ—°μ„±κ³Ό μž¬μ‚¬μš©μ„±, ν…ŒμŠ€νŠΈ μš©μ΄μ„±μ„ λ†’μ—¬μ€€λ‹€.

public class SpellChecker {
    private final Lexicon dictionayr;

    public SpellChecker(Lexicon dictionary){
        // null이면 NPE μ•„λ‹Œκ²½μš° objects λ°˜ν™˜
        this.dictionary = Objects.requireNonNull(dictionary);
    }

    public boolean isValid(String word){}
}

μœ„μ˜ μ˜ˆμ‹œμ—μ„œλŠ” λ‹¨μˆœνžˆ ν•œκ°œμ˜ μžμ›λ§Œ μ‚¬μš©ν•˜μ§€λ§Œ, μžμ›μ΄ λͺ‡ κ°œλ“  의쑴 관계가 μ–΄λ–»κ²Œ λ˜λ“  잘 μž‘λ™ν•œλ‹€. λΆˆλ³€μ„ 보μž₯ν•˜μ—¬ μ—¬λŸ¬ ν΄λΌμ΄μ–ΈνŠΈκ°€ 의쑴 객체λ₯Ό μ•ˆμ‹¬ν•˜κ³  μ‚¬μš©ν•  수 μžˆλ‹€. 의쑴 객체 μ£Όμž…μ€ μƒμ„±μž, 정적 νŒ©ν„°λ¦¬, Builder λͺ¨λ‘μ— λ˜‘κ°™μ΄ 적용 ν•  수 μžˆλ‹€.

Factoryλž€ ν˜ΈμΆœν•  λ•Œλ§ˆλ‹€ νŠΉμ • νƒ€μž…μ˜ μΈμŠ€ν„΄μŠ€λ₯Ό λ°˜λ³΅ν•΄μ„œ λ§Œλ“€μ–΄ μ£ΌλŠ” 객체λ₯Ό λ§ν•˜λŠ”λ°, Factory Method Pattern은 의쑴 객체 μ£Όμž… νŒ¨ν„΄μ„ μ‘μš©ν•΄μ„œ κ΅¬ν˜„ν•œ 것이닀.

@FunctionalInterface
public interface Supplier<T> {

    /**
     * Gets a result.
     *
     * @return a result
     */
    T get();
}

Supplier<T> μΈν„°νŽ˜μ΄μŠ€λŠ” νŒ©ν„°λ¦¬λ₯Ό ν‘œν˜„ν•œ μ™„λ²½ν•œ μ˜ˆμ‹œμ΄λ‹€. 이 방식을 μ‚¬μš©ν•΄ ν΄λΌμ΄μ–ΈνŠΈλŠ” μžμ‹ μ΄ λͺ…μ‹œν•œ νƒ€μž…μ˜ ν•˜μœ„ νƒ€μž…μ΄λΌλ©΄ 무엇이든 생성할 수 μžˆλŠ” νŒ©ν„°λ¦¬λ₯Ό λ§Œλ“€ 수 μžˆλ‹€.

Mosaic create(Supplier<? extends Tile> tileFactory) { ... }

의쑴 객체 μ£Όμž…μ΄ μœ μ—°μ„±κ³Ό ν…ŒμŠ€νŠΈ μš©μ΄μ„±μ„ κ°œμ„ ν•΄μ£Όμ§€λ§Œ, μ˜μ‘΄μ„±μ΄ λ„ˆλ¬΄ λ§Žμ€ ν”„λ‘œμ νŠΈμ—μ„œλŠ” μ½”λ“œλ₯Ό μ–΄μ§€λŸ½κ²Œ ν•˜λ©°, μŠ€ν”„λ§ 같은 의쑴 객체 μ£Όμž… ν”„λ ˆμž„μ›Œν¬λ₯Ό μ‚¬μš©ν•΄ μ½”λ“œμ˜ μ–΄μ§€λŸ¬μ›€μ„ ν•΄μ†Œν•  수 μžˆλ‹€.

Last updated