더블 브레이스로 인스턴스 생성 즉시 값을 넣어줄 수 있는 방법이다.
장점
- 생성과 초기화를 동시에 할 수 있다.
- 코드 가독성이 좋다.
- 적은 수의 코드라인
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");
참고 자료
'언어 & 라이브러리 > 자바' 카테고리의 다른 글
[자바] 자바를 사용하는 이유 (0) | 2022.09.23 |
---|---|
[자바] 상속보다 합성을 사용해야 하는 이유 (0) | 2022.09.13 |
[자바] Long 타입 비교를 equals로 해야만 하는 이유 (0) | 2022.09.13 |
[자바] 병렬 처리 컬렉션 (0) | 2022.04.05 |
자바 Optional이란 (1) | 2022.02.19 |
댓글