목록Java Note/이펙티브 자바 3판(EFFECTIVE JAVA 3E) (6)
럿고의 개발 노트
이펙티브 자바 - 2장. 객체 생성과 파괴 아이템 6. 불필요한 객체 생성을 피하라. 똑같은 기능의 객체를 매번 생성하기보다는 객체 하나를 재사용하는 편이 훨씬 나을때가 있다. 특히 불변 객체는 언제든 재사용할 수 있다. Item1에서 팩터리 메서드를 제공하는 불변클래스에서는 정적 팩터리 메서드를 사용해 불필요한 객체 생성을 피할 수 있다. 예를들어 Boolean(String) 생성자 대신 Boolean.valueOf(String) 팩터리 메서드를 사용하는 것이 좋다. 생성자는 호출할 때마다 새로운 객체를 만들지만, 팩터리 메서드는 전혀 그렇지 않다. 불변 객체만이 아니라 가변 객체라 해도 사용 중에 변경 되지 않을 것임을 안다면 재사용할 수 있다. 생성 비용이 아주 비싼 객체는 반복해서 필요하다면 캐싱..
이펙티브 자바 - 2장. 객체 생성과 파괴 아이템 5. 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라. 많은 클래스가 하나 이상의 자원에 의존한다. 가령 맞춤법 검사기는 사전에 의존하는데, 이런 클래스를 정적 유틸리티 클래스 또는 싱글턴으로 구현한 모습을 볼 수 있다. 정적 유틸리티를 잘못 사용한 예 - 유연하지 않고 테스트하기 어렵다. public interface Lexicon { } public class KoreanDictionary implements Lexicon { } import java.util.List; public class SpellCheckerStatic { private static final Lexicon dictionary = new KoreanDictionary();..
이펙티브 자바 3판 - 2장. 객체 생성과 파괴 아이템 4. 인스턴스화를 막으려거든 private 생성자를 사용하라. 정적 메서드와 정적 필드만을 담은 클래스를 만들고 싶을 때가 있다. Ex) java.lang.Math, java.util.Collections, java.util.Arrays final 클래스와 관련한 메서드들을 모아놓을 때도 사용한다. final 클래스를 상속해서 하위 클래스에 메서드를 넣는건 불가능 하기 때문이다. 정적 멤버만 담은 유틸리티 클래스는 인스턴스로 만들어 쓰려고 설계한게 아니다. 하지만 생성자를 명시하지 않으면 컴파일러가 자동으로 기본 생성자를 생성한다. 즉, 매개변수를 받지 않은 public 생성자가 만들어지며, 사용자는 이 생성자가 자동 생성된 것인지 구분할 수 없다...
이펙티브 자바 3판 - 2장. 객체 생성과 파괴 아이템 3. private 생성자나 열거 타입으로 싱글턴임을 보증하라. 싱글턴(Singleton) 인스턴스를 오직 하나만 생성할 수 있는 클래스다. 전형적인 예로는 함수와 같은 무상태 객체나 설계상 유일해야 하는 시스템 컴포넌트를 들 수 있다. 그러나 클래스를 싱글턴으로 만들면 이를 사용하는 클라이언트를 테스트하기가 어려워질 수 있다. 왜냐하면 타입을 인터페이스로 정의한 다음 그 인터페이스를 구현해서 만든 싱글턴이 아니라면 싱글턴 인스턴스를 가짜(mock) 구현으로 대체할 수 없기 때문이다. 싱글턴을 만드는 방법은 두가지 인데, 두가지 모두 생성자는 private으로 감춰두고, 유일한 인스턴스에 접근할 수 있는 수단으로 public static 멤버를 하나..
이팩티브 자바 3판 - 2장. 객체 생성과 파괴 아이템 2. 생성자에 매개변수가 많다면 빌더를 고려하라. 매개 변수가 많은 코드들을 어떻게 관리해야 할까? 첫번째 대안 - 점층적 생성자 패턴(Telescoping Constructor Pattern) public class NutritionFacts { private final int servingSize; private final int servings; private final int calories; private final int fat; private final int sodium; private final int carbohydrate; public NutritionFacts(int servingSize, int servings, int cal..
이팩티브 자바 3판 - 2장. 객체 생성과 파괴 아이템 1. 생성자 대신 정적 팩터리 메서드를 고려하라. public class StaticFactoryMethodEx1 { public static Boolean valueOf(boolean b){ return b ? Boolean.TRUE : Boolean.FALSE; } } 정적 팩터리 메서드가 생성자보다 좋은 장점 1. 이름을 가질 수 있다. 생성자에 넘기는 매개변수와 생성자 자체만으로 반환될 객체의 특성을 제대로 설명을 못한다면, 정적 팩터리 이름만 잘 지으면 반환될 객체의 특성을 쉽게 묘사할 수 있다. 예를들어 BigInteger(int, int, Random)과 BigInteger.probablePrime(int, Random) 둘 중 "값이 ..