클래스들이 자원에 의존하는 경우가 있다.
SpellCheck 가 Dictionary 라는 유틸리티 클래스를 사용한다고 가정해보자
public class SpellChecker{
private static final Lexicon dictionary = ...;
private SpellChecker(){} // 인스턴스화 방지
public boolean isValid(String word){...}
}
SpellChecker.isValid(word);
public class SpellChecker {
private final Lexicon dictionary = ...;
private SpellChecker() {} // 인스턴스화 방지 (아이템 4 참고)
public static SpellChecker INSTANCE = new SpellChecker(...);
public static boolean isVaild(String word) {...}
}
SpellChecker.INSTANCE.isValid(word);
위의 두 방법 모두 확장에 유연하지 않고 테스트하기 어렵다.
사전에는 다양한 종류가 있을 것이다. (영어 사전, 한국어 사전, 등등..)
dictionary 하나로 이 모든 역할을 수행하기는 불가능하고, SpellChecker 는 하나의 dictionary 만 사용할 수 있기 때문이다.
즉, 사용하는 자원에 따라 달라지는 클래스는 위 두 방법이 적절하지 않다.
인스턴스를 생성할 때 생성자에게 필요한 자원을 넘겨주는 방식이다.
public class SpellChecker{
private final Lexicon dictionary;
public SpellChecker(Lexcion dictionary){
this.dictionary = Objects.requireNotNull(dictionary);
}
public static boolean isValid(String word){...};
}
위 방식은 생성자에 자원 팩터리를 넘겨주는 방식으로 응용할 수도 있다.