많은 클래스가 하나 이상의 자원에 의존한다.
예를 들어 맞춤법 검사기는 사전에 의존하는 데, 이런 클래스를 정적 유틸리티 클래스로 구현한 모습을 볼 수 있다.
public class SpellChecker{
private static final Lexicon dictionary = ..;
private SpellChecker(){} // 객체 생성 방지
public static boolean isValid(String word){...}
public static List<String> suggestions(String typo){...}
}
비슷하게 싱글턴으로 구현하는 경우도 흔하다.
public class SpellChecker{
private final Lexicon dictionary = ...;
private SpellChecker(...){}
public static SpellChecker INSTANCE = new SpellChecker(...);
public boolean isValid(String word){...}
public List<String> suggestions(String typo){...}
}
두 방식 모두 사전을 단 하나만 사용한다고 가정한다는 점에서 잘 짜여진 코드라고 볼 수는 없다.
실전에서는 사전이 언어별로 따로 있고 특수 어휘용 사전을 따로 두기도 한다.
SpellChecker가 여러 사전을 사용할 수 있도록 만들어보자.
간단히 dictionary 필드에서 final 한정자를 젝하고 다른 사전으로 메서드를 추가할 수 있지만,
이 방식은 오류를 내기 쉽고 멀티스레드 환경에서는 쓸 수 없다.
사용하는 자언에 따라 동작이 달라지는 클래스에는 정적 유틸리티 클래스나 싱글턴 방식이 적합하지 않다.
대신 클래스가 여러 자원 인스턴스를 지원해야하며, 클라이언트가 원하는 자원을 사용해야한다.
이 조건을 만족하는 간단한 패턴은 바로, 인스턴스를 생성할 때 생성자에 필요한 자원을 넘겨주는 방식이다.
이는 의존 객체 주입의 한 형태로, 맞춤법 검사기를 생성할 때 의존객체인 사전을 주입해 주면 된다.
public class SpellChecker{
private final Lexicon dictionary;
public SpellChecker(Lexicon dictionary){
}
}
참고 : 책, 이펙티브 자바 3/E
'Backend > Java' 카테고리의 다른 글
[이펙티브자바] 다 쓴 객체 참조를 해제하자. (0) | 2021.07.07 |
---|---|
[이펙티브자바] 불필요한 객체 생성을 피하자. (0) | 2021.07.06 |
[이펙티브 자바] 인스턴스화를 효과적으로 막는 방법 (1) | 2021.06.10 |
[이펙티브 자바] 싱글턴 객체를 보장하는 세가지 방법 (0) | 2021.06.04 |
[이펙티브 자바] 생성자에 매개변수가 많을 때 효율적인 해결 방법 (0) | 2021.06.02 |