많은 클래스가 하나 이상의 자원에 의존한다.

public class SpellChecker {

    private static final Lexicon DICTIONARY = ...;

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

    public static boolean isValid(final String word) { ... }
    public static List<String> suggestions(final String typo) { ... }
}
public class SpellChecker {

    private final Lexicon dictionary = ...;

    private SpellChecker(...) { ... }
    public static SpellChecker INSTANCE = new SpellChecker(...);

    public boolean isValid(final String word) { ... }
    public List<String> suggestions(final String typo) { ... }
}

위 두 방식 모두 사전을 단 하나만 사용한다고 가정하면, 그리 훌륭하지 않다!

<aside> 💡 그렇다면, SpellChecker 가 여러 사전을 사용할 수 있게 만드려면?

</aside>

사용하는 자원에 따라 동작이 달라지는 클래스에는 정적 유틸리티 클래스나 싱글턴 방식이 적합하지 않다!

인스턴스를 생성할 때 생성자에 필요한 자원을 넘겨주는 방식을 사용해보자! → 의존 객체 주입

public class SpellChecker {

    private final Lexicon dictionary; // final로 불변을 보장하자

    public SpellChecker(final Lexicon dictionary) { // 생성자에 필요한 자원을 넘겨준다
        this.dictionary = Objects.requireNonNull(dictionary);
    }
    
    public boolean isValid(final String word) { ... }
    public List<String> suggestions(final String typo) { ... }
}