List 인터페이스에서 List.of 의 오버로드 vs 가변인수

반응형
728x90
반응형

List.of  오버로드

List 인터페이스의 of 메소드를 보면 아래와 같이 다양한 오버로드 버전이 있다.

static <E> List<E> of() {
	return ImmutableCollections.emptyList();
}

static <E> List<E> of(E e1) {
	return new ImmutableCollections.List12<>(e1);
}

static <E> List<E> of(E e1, E e2) {
	return new ImmutableCollections.List12<>(e1, e2);
}
    
static <E> List<E> of(E e1, E e2, E e3) {
	return new ImmutableCollections.ListN<>(e1, e2, e3);
}
    
...

static <E> List<E> of(E e1, E e2, E e3, E e4, E e5, E e6, E e7, E e8, E e9, E e10) {
  return new ImmutableCollections.ListN<>(e1, e2, e3, e4, e5,
  e6, e7, e8, e9, e10);
}

 

 

가변인수

static <E> List<E> of (E... elements)

 

가변인수 사용시, 추가 배열을 할당해서 리스트로 감싼다. 배열을 할당하고 초기화하며 나중에 가비지 컬렉션을 하는 비용을 지불해야한다. 하지만 위의 코드처럼 고정된 숫자의 요소를 API로 정의하여 이런 비용을 제거할 수 있다. 위에서 봤듯이, List.of 메소드는 인수 10개의 요소를 가진 리스트까지만 만들수 있고 그 이상의 요소는 가변인수를 이용하는 메소드가 사용된다.

static <E> List<E> of(E... elements) {
  switch (elements.length) { // implicit null check of elements
    case 0:
    	return ImmutableCollections.emptyList();
    case 1:
    	return new ImmutableCollections.List12<>(elements[0]);
    case 2:
    	return new ImmutableCollections.List12<>(elements[0], elements[1]);
    default:
    	return new ImmutableCollections.ListN<>(elements);
  }
}

 

 

반응형

Designed by JB FACTORY