이펙티브자바 4

[아이템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 } ... ... ... } ..

[아이템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(); } } -> 생성자 이름이 없음 반환될 객체의 특성을 알기 힘듦 -> 정적 팩토리 메서드 이름..