[Effective Java 3/e] 아이템 5 - 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라


아이템 5 - 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라

정적 유틸리티를 잘못 사용한 예 - 유연하지 않고 테스트하기 어렵다

public class SpellChecker {
  private static final Lexicon dictionary = ...;
  private SpellChecker() {}
  
  public static boolean isValid(String word) { ... }
}

싱글턴을 잘못 사용한 예 - 유연하지 않고 테스트하기 어렵다

public class SpellChecker {
  private final Lexicon dictionary = ...;
  private SpellChecker() {}
  public static SpellChecker INSTANCE = new SpellChecker(...);

  public static boolean isValid(String word) { ... }
}

의존 객체 주입은 유연성과 테스트 용이성을 높여준다

public class SpellChecker {
  private final Lexicon dictionary;
  private SpellChecker(Lexicon dictionary) {
    this.dictionary= Objects.requireNonNull(dictionary);
  }
  public boolean isValid(String word) { ... }
}

아이템 5 - 정리

  • 클래스가 내부적으로 하나 이상의 자원에 의존하고, 그 자원이 클래스 동작에 영향을 준다면 싱글턴과 정적 유틸리티 클래스는 사용하지 않는 것이 좋다.