자원을 직접 명시하지 말고 의존 객체 주입을 사용하라.
대부분의 클래스는 하나 이상의 다른 클래스를 의존한다.
하지만 의존한 클래스가 동작에 영향을 준다면 싱글턴과 정적 유틸리티 클래스는 사용하지 않는것이 좋다.
정적 유틸리티
public class SpellChecker {
private static final Lexicon dictionary = new Lexicon();
private SpellChecker() {} // 객체 생성 방지
public static boolean isValid(String word) { ... }
public static List<String> suggestions(String typo) { ... }
}
싱글턴
public class SpellChecker {
private final Lexicon dictionary = new Lexicon();
private SpellChecker(...) {}
public static SpellChecker INSTANCE = new SpellChecker(...);
public boolean isValid(String word) { ... }
public List<String> suggestions(String typo) { ... }
}
이 두 방식은 모두 하나의 Lexicon을 사용한다는 가정하에 점에서는 좋아보이지만, 실전에서는 테스트용 Lexcion 구현체가 필요 할 수도 있고 상황에 따라 Lexicon의 여러 구현체를 사용할 때도 있다.
setter를 이용해 Lexcion을 필요할때마다 변경
그렇다면 필드에서 final을 제거하고 settter를 이용해 필요할때마다 교체하는건 어떨까?
public class SpellChecker {
private Lexicon dictionary = new Lexicon();
private SpellChecker(...) {}
public static SpellChecker INSTANCE = new SpellChecker(...);
public boolean isValid(String word) { ... }
public List<String> suggestions(String typo) { ... }
public void setLexicon(Lexcion dictionary) {
this.dictionary = dictionary;
}
}
이 방식은 어색하고 오류를 내기 쉽고 멀티 쓰레드 환경에서는 사용하기 어렵다.
의존 객체 주입
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) { ... }
}
의존 객체 주입 방식은 인스턴스를 생성할때 의존하는 객체를 생성자에 넘겨주는 방삭이다.
이 방식은 불변을 보장하여 여러 클라이언트가 의존 객체들을 안심하고 공유 할 수 있기도하며 의존 객체 주입은 생성자, 정적 팩터리, 빌더 모두에 똑같이 응용 할 수 있다.
하지만 이 방식 유연성과 테스트 용이성을 개선 해주긴 하지만, 클래스 내에서 의존하는 객체가 엄청나게 많아지는 상황에서는 코드를 어지럽게 만들기도 한다.
'book review > Effective java' 카테고리의 다른 글
[Effective Java] Item 7. 다 쓴 객체 참조를 해제하라 (1) | 2024.02.07 |
---|---|
[Effective Java] Item 6. 불필요한 객체 생성을 피하라 (0) | 2024.02.06 |
[Effective Java] Item 4. 인스턴스화를 막으려거든 private 생성자를 사용하라 (0) | 2024.02.02 |
[Effective Java] Item 3. 생성자나 열거 타입으로 싱글턴임을 보증하라 (1) | 2024.02.01 |
[Effective Java] Item 2. 생성자에 매개변수가 많다면 빌더를 고려하라 (0) | 2024.01.31 |