많은 클래스가 하나 이상의 자원에 의존한다.
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>
final
을 제거하고 다른 사전으로 교체하는 메서드를 추가할 수 있다.
→ 사용하는 자원에 따라 동작이 달라지는 클래스에는 정적 유틸리티 클래스나 싱글턴 방식이 적합하지 않다!
인스턴스를 생성할 때 생성자에 필요한 자원을 넘겨주는 방식을 사용해보자! → 의존 객체 주입
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) { ... }
}