enum class ShowCategory {
SliceOfLife,
Isekai,
Mecha,
Sports,
Shonen,
}
values()를 사용하려할 것이다.
‘Enum.values()’ is recommended to be replaced by ‘Enum.entries’ since 1.9
values가 더 이상 권장되지 않는 이유는 다음과 같다.
values()는 상수들의 배열(을 반환한다. 배열은 원칙적으로 내부 값이 변경될 수 있는 자료구조이기 때문에, 호출할 때마다 새로운 배열이 할당되고 복제되는 구조다. 이로 인해 불필요한 메모리 할당과 객체 생성을 유발하여 비효율적이다.values()는 mutable 배열을 반환하므로, 값을 리스트나 기타 컬렉션으로 따로 변환해야 하는 번거로움이 있다.HttpStatus.resolve가 내부적으로 values를 사용하여 실제 벤치마크 성능에 영향을 줬다는 사례도 존재한다.val entires: EnumEntries<ShowCategory> = ShowCategory.entires
entries는 enum의 새로 추가된 프로퍼티로 EnumEntires<E> 객체를 반환한다.
EnumEntries<E>)를 미리 생성해두고, 호출 시에도 이 동일 객체를 “재사용”한다.EnumEntries<E>
sealed 인터페이스로 List를 상속받는다./**
[List] 인터페이스의 특수한 불변 구현체로,
지정된 enum 타입 [E]의 모든 enum 엔트리를 포함합니다.
[EnumEntries]는 소스 코드에 선언된 순서대로 모든 enum 엔트리를 포함하며,
각 엔트리는 [Enum.ordinal] 값과 일관된 순서를 가집니다.
이 인터페이스의 인스턴스는 EnumClass.entries 프로퍼티나 [enumEntries] 함수를 통해 얻을 수 있습니다.
구현 참고
contains 및 indexOf와 같은 모든 기본 연산은 상수 시간( O(1) )에 실행되며,
일반적인 ArrayList<E>보다 더 빠르게 동작할 수 있습니다.
*/
@SinceKotlin("1.9")
@WasExperimental(ExperimentalStdlibApi::class)
public sealed interface EnumEntries<E : Enum<E>> : List<E>
EnumEntries)를 사용한 이유
List는 모든 enum 엔트리들의 목록이라는 의도를 잘 표현하지 못한다.enum 상수 리스트를 통해 모든 가능한 값을 다루는 유틸리티를 작성하고 싶을 때 단순 리스트로는 그 작업을 하기 매우 번거롭다.
sealed 클래스인 이유
EnumEntries의 모든 구현을 컴파일 타임에 완전히 알 수 있게 보장한다.EnumEntries를 구현해서 혼란을 유발하거나, 라이브러리 설계 의도와 다르게 확장하는 것을 막아 API 안전성 및 일관성을 확보한다.