본문 바로가기
언어 & 라이브러리/자바

[자바] Double Brace Initialization

by illlilillil 2022. 4. 5.

더블 브레이스로 인스턴스 생성 즉시 값을 넣어줄 수 있는 방법이다.

장점

  • 생성과 초기화를 동시에 할 수 있다.
  • 코드 가독성이 좋다.
  • 적은 수의 코드라인
HashMap<String, String> hashMap2 = new HashMap<>() {{
            put("A", "1"); put("B", "2");
        }};

그러나 아래 결과와 같이 class가 다르다.

import java.util.*;

public class Main {
    public static void main(String[] args) throws Exception {
        HashMap<String, String> map = new HashMap<>();
        map.put("frank", "1");
        map.put("potter", "2");
        
        HashMap<String, String> braceMap = new HashMap<>() {{
            put("frank", "1"); 
            put("potter", "2");
        }};
        
        HashMap<String, String> braceMap2 = new HashMap<>() {{
            put("frank", "1"); 
            put("potter", "2");
        }};
        
        System.out.println(map); 
        System.out.println(braceMap);
        System.out.println(braceMap2);

        System.out.println(map.getClass());
        // class java.util.HashMap
        System.out.println(braceMap.getClass());
        // class com.company.Main$1
        System.out.println(braceMap2.getClass());
        // class com.company.Main$2
    }
}

자바에서는 안티 패턴으로 간주하는데 이유는 다음과 같다.

  • 대중적이지 않은 초기화 방법
  • 사용할때마다 추가 클래스가 생성된다. → Main$1,2
    • 직렬화나 가비지 컬렉션에서 문제가 발생할 수 있다.
  • 메모리 누수가 날 수 있는 인스턴스에 대한 참조가 일어날 수 있다.

 

대체재들

자바 8 스트림 팩토리 메서드

Set<String> countries = Stream.of("India", "USSR", "USA")
      .collect(collectingAndThen(toSet(), Collections::unmodifiableSet));

 

자바 9 컬렉션 팩토리 메서드

List<String> list = List.of("India", "USSR", "USA");

 

참고 자료

https://www.baeldung.com/java-double-brace-initializatio

댓글