사전객체에 의존하는 맞춤법 검사기 클래스를 정적 유틸리티 클래스, 또는 싱글턴 클래스로 만든다는 것?
-> 사전객체의 종류가 얼마든지 바뀔 수 있다는 판단을 하지 못한 것.
-> 필드에 사전을 가지고 있는 순간 final 을 제거하여 사전을 교체할 수 있다고 하더라도 멀티 스레드환경에서 안정적이지 못하다. 동시에 여러 스레드가 해당 필드에 접근하고 있는데 누군가 이 필드를 다른 사전으로 교체한다면?
즉, 클래스가 하나 이상의 자원에 의존하고 그 자원이 클래스의 동작에 영향을 준다면 정적 유틸리티 클래스나 싱글턴 방식은 적합하지 않다.
다시 말해 이 클래스는 사용자마다 다른 사전을 가지고 맞춤법 검사 기능을 제공해야 한다.
이를 해결할 수 있는 방법으로는 "인스턴스를 생성할 때 생성자에 필요한 자원을 넘겨주는 방식"이 있다.
DI 패턴의 변형으로는 생성자에 자원 팩터리를 넘겨주는 것이다. 이때, 한정적 와일드카드 타입을 통해 Supplier 타입을 제한해야 한다.
SpellChecker(Supplier<? extends Dictionary> dictionaryFactory){
this.dictionary = dictionaryFactory.get();
}
'책, 강의 정리 > 이펙티브자바' 카테고리의 다른 글
아이템 [7] - 다 쓴 객체 참조를 해제하라 (0) | 2020.01.10 |
---|---|
아이템 [6] - 불필요한 객체생성을 피하라 (0) | 2020.01.06 |
아이템 [4] - 인스턴스화를 막으려거든 private 생성자를 사용하라 (0) | 2020.01.03 |
아이템 [3] - private 생성자나 열거타입으로 싱글턴임을 보증하라 (0) | 2020.01.01 |
아이템 [2] - 생성자 매개변수가 많다면 빌더를 고려하라 (0) | 2019.12.29 |