본문 바로가기

Reading/Effective Java

(65)
[Effective-Java] Item 5. 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 사전을 이용해서 맞춤법 검사기를 만든다고 해보자. 맞춤법 검사기는 사전에 의존하게 된다. 1. 정적 유틸리티를 사용한 클래스 public class SpellCheckerStaticUtility { private static final Lexicon dictionary = new KoreanDictionary(); private SpellCheckerStaticUtility() { } public boolean isValid(String word) { ... } public List suggestions(String typo) { ... } } 2. 싱글톤을 사용한 클래스 public class SpellCheckerSingleton { private final Lexicon dictionary = ne..
[Effective-Java] Item 4. 인스턴스화를 막으려거든 private 생성자를 사용하라 정적 메소드와 정적 피드만을 담은 클래스를 만들고 싶을 때가 있다. java.lang.Math와 java.util.Arrays처럼 기본 타입 값이나 배열 관련 메소드들을 모아놓기 위해 java.util.Collections처럼 특정 인터페이스를 구현하는 객체를 생성해주는 정적 메서드를 모아놓기 위해 final 클래스를 상속하여 하위 클래스에 메소드를 넣는 것은 불가능하니 final관련 클래스와 관련한 메소드들을 모아놓기 위해 정적 멤버만 담은 유틸리티 클래스는 인스턴스로 만들어 쓰려고 설계한게 아니다. 추상클래스로 만드는 것은 하위 클래스를 만들어 인스턴스화 하면 되기 때문에, 막을 수 없다. 그리고 생성자를 명시하지 않으면 컴파일러가 자동으로 기본생성자를 만들기 때문에 private 생성자를 추가해 인..
[Effective-Java] Item 3. private 생성자나 열거 타입으로 싱글턴임을 보증하라 싱글톤(Singleton): 인스턴스를 오직 하나만 생성하는 클래스 예: 함수와 같은 무상태(stateless) 객체나 설계상 유일해야하는 시스템 컴포넌트 문제점: 싱글톤 패턴을 구현하는 코드 자체가 많이 들어간다. 의존관계상 클라이언트가 구체 클래스에 의존한다. DIP를 위반한다. client가 구체 클래스에 의존해서 OCP 원칙을 위반할 가능성이 높다. 싱글톤 클래스는 테스트하기 어렵다. mock 구현으로 대체할 수 없기때문이다. 내부 속성을 변경하거나 초기화 하기 어렵다. private 생성자로 자식 클래스를 만들기 어렵다. 유연성이 떨어진다. 안티패턴으로 불리기도 한다 public static final 필드 방식의 싱글톤 public class SingletonPublicStaticFinalFi..
[Effective-Java] Item 2. 생성자에 매개변수가 많다면 빌더를 고려하라 정적 팩터리 메서드와 생성자는 매개변수가 많이 필요한 경우 적절한 대응이 어려워진다. 이에대한 3가지 대안이 있다. 1. 점층적 생성자 패턴(telescoping constructor pattern) //필수 매개변수만 받는 생성자 public NutritionFactsConstructor(int servingSize, int servings) { this(servingSize,servings,0); } // 필수 매개변수 + 선택 매개변수 1개 public NutritionFactsConstructor(int servingSize, int servings, int calories) { this(servingSize,servings,calories,0); } // 필수 매개변수 + 선택 매개변수 2개 p..