effectivejava 6

[아이템07] 다 쓴 객체 참조를 해제하라

Java는 C/C++ 언어와는 달리 가비지 컬렉터가 메모리를 관리하고 있다. 하지만 Java 역시 메모리 관리에 신경을 써야 한다. public class Stack { private Object[] elements; private int size = 0; private static final int DEFAULT_INITIAL_CAPACITY = 16; public Stack(){ elements = new Object[DEFAULT_INITIAL_CAPACITY]; } public void push(Object e){ ensureCapacity(); elements[size++] = e; } public Object pop() { if(size == 0) throw new EmptyStackExcep..

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

많은 클래스가 하나 이상의 자원에 의존한다. 맞춤법 검사기는 사전에 의존하는데, 이런 클래스를 정적 유틸리티 클래스로 구현하는 모습을 많이 볼 수 있다. //정적 유틸리티를 잘못 사용한 예 public class SpellChecker { private final Lexicon dictionary = ...; private SpellChecker() {} // 객체 생성 방지 public static boolean isValid(String word) {...} public static List suggestions(String typo) {...} } //싱글턴을 잘못 사용한 예 public class SpeelChecker { private final Lexicon dictionary = ...; p..

[아이템04] 인스턴스화를 막으려거든 private 생성자를 사용하라

개발을 하다 보면 정적 메서드와 정적 필드만을 담은 클래스를 만들 때가 있다. java.lang.Math와 java.util.Arrays처럼 기본 타입 값이나 배열 관련 메서드들을 모아 놓을 수 있다. //Math 메서드 public final class Math { private Math() {} public static final double E = 2.7182818284590452354; public static final double PI = 3.14159265358979323846; public static double sin(double a) { return StrictMath.sin(a); // default impl. delegates to StrictMath } ... ... ... } ..

[아이템03] private 생성자나 열거 타입으로 싱글턴임을 보증하라

싱글톤(Singleton) 인스턴스를 오직 하나만 생성할 수 있는 클래스를 말한다. 싱글톤 생성 방식 보통 두 방식을 사용하며 두 방식 모두 생성자는 private으로 감춰두고, 유일한 인스턴스에 접근할 수 있는 수단으로 public static 멤버를 하나 마련한다. 1. public static final 필드 방식 public class Singleton { public static final Singleton INSTANCE = new Singleton(); private Singleton() {}; } 장점 해당 클래스가 싱글턴임이 API에 명확히 드러난다. 간결함 private 생성자는 Singleton.INSTANCE를 초기화할 때 딱 한 번만 호출된다. 또한 private 외 다른 생성자가..

[아이템02] 생성자에 매개변수가 많다면 빌더를 고려하라

정적 팩터리와 생성자는 선택적 매개변수가 많을 때 적절히 대응하기 어렵다. public class NutritionFacts { private final int servingSize; private final int servings; private final int calories; private final int fat; public NutritionFacts(int servingSize, int servings){ this(servingSize,servings,0); } public NutritionFacts(int servingSize, int servings, int calories){ this(servingSize,servings,calories,0); } public NutritionFacts..

[아이템01] 생성자 대신 정적 팩터리 메서드를 고려하라

클래스의 인스턴스를 얻는 전통적 수단은 public 생성자이다. 클래스는 생성자와 별도로 정적 팩터리 메서드를 제공할 수 있다. public 생성자 대신 정적 팩터리 메서드가 좋은 이유 5가지 첫 번째. 이름을 가질 수 있다. public class Dante { public Dante(){ //생성자 System.out.println("HI"); } public static void DanteWithMoney(){ // 정적 팩토리 메서드 System.out.println("I have money"); } public static void main(String[] args) { DanteWithMoney(); } } -> 생성자 이름이 없음 반환될 객체의 특성을 알기 힘듦 -> 정적 팩토리 메서드 이름..