본문 바로가기

책, 강의 정리/이펙티브자바

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

사전객체에 의존하는 맞춤법 검사기 클래스를 정적 유틸리티 클래스, 또는 싱글턴 클래스로 만든다는 것?

-> 사전객체의 종류가 얼마든지 바뀔 수 있다는 판단을 하지 못한 것.

-> 필드에 사전을 가지고 있는 순간 final 을 제거하여 사전을 교체할 수 있다고 하더라도 멀티 스레드환경에서 안정적이지 못하다. 동시에 여러 스레드가 해당 필드에 접근하고 있는데 누군가 이 필드를 다른 사전으로 교체한다면? 

 

 

 

즉, 클래스가 하나 이상의 자원에 의존하고 그 자원이 클래스의 동작에 영향을 준다면 정적 유틸리티 클래스나 싱글턴 방식은 적합하지 않다. 

 

 

 

다시 말해 이 클래스는 사용자마다 다른 사전을 가지고 맞춤법 검사 기능을 제공해야 한다.

 

이를 해결할 수 있는 방법으로는 "인스턴스를 생성할 때 생성자에 필요한 자원을 넘겨주는 방식"이 있다.

 

 

 

DI 패턴의 변형으로는 생성자에 자원 팩터리를 넘겨주는 것이다. 이때, 한정적 와일드카드 타입을 통해 Supplier 타입을 제한해야 한다.

SpellChecker(Supplier<? extends Dictionary> dictionaryFactory){
	this.dictionary = dictionaryFactory.get();
}