생성과 파괴.

생성과 파괴에서는 객체를 만들때와 만들지 말아야할때, 올바른 객체 생성 방법, 불필요한 생성을 피하는 방법등을 숙지합니다.

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

정적 팩터리 메서드의 장점

정적 팩터리 메서드의 단점

흔히 사용되는 정적 팩터리 메서드 이름

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

// 생성자, 각 매개변수의 의미를 알 수 없다
NutritionFacts nuutritionFacts = new NutritionFacts(240, 8, 100, 0, 35, 26);

// 정적 펙터리 매서드, 각 매개변수의 의미를 알 수 없다
NutritionFacts nuutritionFacts = NutritionFacts.newInstance(240, 8, 100, 0, 35, 26);

// 빌더, 객체 생성시 보다 명확한 코드를 제공한다
NutritionFacts nuutritionFacts = NutritionFacts
                                  .builder()
                                  .servingSize(240)
                                  .servings(8)
                                  .calories(100)
                                  .fat(0)
                                  .sodium(35)
                                  .carbohydrate(25)
                                  .build();

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

싱글턴을 제공하는 3가지 방법

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

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

아이템 6. 불필요한 객체 생성을 피하라

// 같은 문자열 리터럴인 effective-java를 매번 불필요하게 생성
String s = new String("effective-java");
// 개선된 버전 - JVM은 같은 문자열 리터럴을 사용하는 코드는 같은 객체를 재상요함이 보장됨
String s = "effective-java";
String s = String.valueOf("effective-java");
// long이 아닌 Long
Long sum = 0L;
for (long i = 0; i<= Integer.MAX_VALUE; i++){
  // Integer.MAX_VALUE개의 Long 객체가 생성됨
  sum += i;
}

아이템 7. 다 쓴 객체 참조를 해제하라

아이템 8. finalizer와 cleaner 사용을 피하라

아이템 9. try-finally보다는 try-with-resources를 사용하라

// try-finally 예
// close에서 예외가 발생할 수 있음
static String firstLineOfFile(String path) throws IOException {
  BufferedReader br = new BufferedReader(new FileReader(path));
  try {
    return br.readLine();
  } finally {
    br.close();
  }
}

// try-with-resources 예
static String firstLineOfFile(String path) throws IOException {
  try(BufferedReader br = new BufferedReader(new FileReader(path))) {
    return br.readLine();
  }
}