목록Effective Java/객체 생성과 파괴 (5)
개발일기
많은 클래스가 하나 이상의 자원에 의존한다. 가령 맞춤법 검사기는 사전에(dictionary)에 의존하는데, 이런 클래스를 정적 유틸리티 클래스(아이템4)로 구현한 모습을 드물지 않게 볼 수 있다. 5-1 정적 유틸리티를 잘못 사용한 예 - 유연하지 않고 테스트하기 어렵다. public class SpellChecker { private static final Lexicon dictionary = ...; private SpellChecker() { } // 객체 생성 방지 public static boolean is Vaild (String word) public static List suggestions(String typo) {...} } 5-2 싱글턴을 잘못 사용한 예 - 유연하지 않고 테스트하기..
정적 메서드와 정적 필드만을 담은 클래스를 만들고 싶을 때가 있을 것이다. 객체 지향적으로 사고하지 않는 이들이 종종 남용하는 방식이기 때문에 그리 곱게 보이지는 않지만, 나름의 쓰임새가 있다. 1. java.lang.Math와 java.util.Arrays처럼 기본 타입 값이나 배열 관련 메서드들을 모아놓을 수 있다. 2. java.util.Collections처럼 특정 인터페이스를 구현하는 객체를 생성해주는 정적 메서드(혹은 팩터리) 를 모아 놓을 수 있음 3. 마지막으로, final 클래스와 관련한 메서드들을 모아놓을 때도 사용한다. final 클래스를 상속해서 하위 클래스에 메서드를 넣는 건 불가능하기 때문이다. 정적 멤버만 담은 유틸리티 클래스는 인스턴로 만들어 쓰려고 설계한게 아니다. 하지만 ..
싱글턴(singleton)이란 인스턴스를 오직 하나만 생성할 수 있는 클래스를 말한다. 싱글턴을 사용하는 전형적인 예로 무상태(stateless) 객체나 설계상 유일해야 하는 시스템 컴포넌트를 들 수 있다. 그런데 클래스를 싱글턴으로 만들면 이를 사용하는 클라이언트를 테스트하기가 어려워질 수 있다. 타입을 정의한 다음 인터페이스를 구현해서 만든 싱글턴이 아니라면 싱글턴 인스턴스를 가짜(mock)구현으로 대체할 수 없기 때문이다. 싱글턴 만드는 방식 3가지 3-1. public static final 필드 방식의 싱글턴 public class Elvis{ public static final Elvis INSTANCE = new Elvis(); private Elvis() { ... } public void..
정적 팩터리와 생성자에는 똑같은 제약이 하나 있다. 선택적 매개변수가 많을 때 적절히 대응하기 어렵다는 점이다. 다양한 생성자를 사용하여야 할 때 , 점층적 생성자 패턴(telescoping constructor pattern)을 즐겨 사용했다. 점층적 필수 매개변수만 받는 생성자 , 필수 매개변수와 선택 매개변수 1개를 받는 생성자, 선택 매개변수를 2개까지 받는 생성자, … 형태로 선택 매개변수를 전부 다 받는 생성자까지 늘려가는 방식이다. 아래의 코드가 그 예이다. public class NutritionFacts { private final int servingSize; private final int servings; private final int calories; private final i..
Item 1: 생성자 대신 정적 팩터리 메서드를 고려하라 핵심 주제정적 팩토리 메서드의 장점 5가지이름을 가질 수 있다두번째, 호출될 때마다 인스턴스를 새로 생성하지는 않아도 된다.세 번째, 반환 타입의 하위 타입 객체를 반환할 수 있는 능력이 있다 예시 코드는 아래와 같다.public class Cat { private static Cat cat = null; private Cat() {} public static Cat getInstance() { // 초기화 if(cat == null) { cat = new Cat(); } return cat; }}public interface Shape { // Shape interface..