공부/Java

[Java] Enum values 배열을 리스트 변환 (Baeldung, Enum values to List)

leejinwoo1126 2023. 7. 21. 22:50
반응형

 

 


Enum values to List 

기본적으로 제공하는 values() method를 사용하게 되면 아래와 같이 배열[] 형태로 값이 반환된다. 

PizzaStatus[] values = PizzaStatus.values(); // [ORDERED, READY, DELIVERED]

 

개인적으로 values()와 forEach 구문을 활용하여 많이 사용했는데, Array -> List 로 변경하는 방식에 대해 Baeldung 포스팅이 있어서 내용을 정리해본다. 

 

1. 클래스 타입 토큰을 인자로 전달받아 사용하는 static method 경우

static <T> List<T> enumValuesInList(Class<T> enumClass) {
    T[] arr = enumClass.getEnumConstants(); // Enum 아닌 경우 null
    return arr == null ? Collections.EMPTY_LIST : Arrays.asList(arr);
}

@DisplayName("enumValuesInList()는 Enum 클래스인 경우 List를 반환하고, 아닌 경우 빈 리스트를 반환한다")
@Test
void enumValuesInListOrEmptyList_test() {
    // given
    List<PizzaStatus> givenPizzaStatuses = Arrays.asList(PizzaStatus.values());

    // when
    List<PizzaStatus> pizzaStatuses = enumValuesInList(PizzaStatus.class);
    List<Integer> emptyList = enumValuesInList(Integer.class);

    // then
    assertThat(givenPizzaStatuses).isEqualTo(pizzaStatuses); // Ok
    assertThat(emptyList).isEmpty(); // Ok
}

 

위의 static method에서 타입 매개 변수를 enum으로만 제한하는 것도 가능하다. 

static <T extends Enum<T>> List<T> enumValuesInList(Class<T> enumClass) {
    return Arrays.asList(enumClass.getEnumConstants());
}

List<PizzaStatus> pizzaStatuses = enumValuesInList(PizzaStatus.class); // Ok. Enum PizzaStatus 
List<Integer> integers = enumValuesInList(Integer.class); // Compile Error. Integer 클래스

- 클래스 타입 인자가 enum 클래스가 아닌 경우 Compile Error 가 발생한다. (generic type safe

 

 

2. EnumSet.allOf() 사용하는 경우 

@DisplayName("EnumSet의 allOf 메서드를 활용하여 Enum List를 만들 수 있다")
@Test
void test() {
    // give
    List<PizzaStatus> givenPizzaStatusList = Arrays.asList(PizzaStatus.values());

    // when
    List<PizzaStatus> pizzaStatuses = new ArrayList<>(EnumSet.allOf(PizzaStatus.class)); // 인자로 EnumSet<PizzaStatus> 전달

    // then
    Assertions.assertThat(givenPizzaStatusList).isEqualTo(pizzaStatuses); // Ok
}

 

ArrayList 생성자

- 내부에서 EnumSet 를 Object[] 로 변환 후 처리하고 있다

매개변수에 있는 상한 경계 와일드 카드 제네릭 Collection<? extends E>을 풀어보면
Collection<? extends PizzaStatus> 이므로 EnumSet<PizzaStatus>을 인자로 전달 가능

 

EnumSet의 경우 클래스를 타고 올라가다보면 Collection을 구현하고 있다.

Collection<E> 발견

 

Arrays.asList() 나 List.of() static method의 경우에도 List를 만들어주는 걸로 알아서 테스트 해봤는데,메서드 매개변수가 T(Object)만 할당 받아서 이중 배열 형태가 되었다. (비추천)

// [[READY, ORDERED, DERIVERED]]
List<EnumSet<PizzaStatus>> test1 = Arrays.asList(EnumSet.allOf(PizzaStatus.class));
List<EnumSet<PizzaStatus>> test2  = List.of(EnumSet.allOf(PizzaStatus.class));

Arrays 클래스
List 인터페이스


출처 

https://www.baeldung.com/java-enum-values-to-list

반응형