Kotlin에서 열거형(enum class)은 제한된 값 세트를 선언하고 메서드와 속성으로 확장할 수 있도록 합니다.
enum class Direction { NORTH, SOUTH, WEST, EAST }
enum 요소는 해당 하위 클래스의 인스턴스인 싱글톤입니다.enum class Color(val rgb: Int) { RED(0xFF0000), GREEN(0x00FF00), BLUE(0x0000FF); fun containsRed() = (rgb and 0xFF0000 != 0) }
Color.RED.name), 인덱스(ordinal)로 접근하고 values()를 통해 전체 목록을 얻을 수 있습니다.== (identity)를 통해 비교됩니다. 요소가 고유하기 때문입니다.Kotlin의 enum 클래스 내에서 Java와 마찬가지로 모든 요소가 재정의해야 하는 추상 메서드를 정의할 수 있습니까?
정답: 네, enum 스타일로 추상 메서드를 선언할 수 있으며, 각 요소는 자신의 구현을 제공해야 합니다!
enum class State { START { override fun next() = RUNNING }, RUNNING { override fun next() = STOPPED }, STOPPED { override fun next() = STOPPED }; abstract fun next(): State }
이야기
Java에서 Kotlin으로 마이그레이션하는 과정에서 팀은 새 enum 클래스를 일반 클래스처럼 상속하려고 했습니다. enum은 상속할 수 없다는 것을 알게 되었고 아키텍처가 위배되었습니다. 상태 머신의 모듈성 접근 방식을 완전히 바꿔야 했습니다.
이야기
데이터베이스에 값을 저장하기 위해 요소의 이름(
enum.name)을 사용했지만 enum을 리팩토링하면서 요소의 이름이 변경되어 데이터베이스의 데이터가 새로운 로직과 일치하지 않게 되어 일관성이 상실되었습니다 (storage value pattern이 구현되지 않았습니다).
이야기
Gson을 통해 enum 클래스를 직렬화하기 위해 사용자 지정 TypeAdapter를 연결하는 것을 잊었습니다. 프로덕션에서 서비스가 JSON의 잘못된 값을 반환하기 시작했는데, 기본 파서가 잘못된 필드(ordinal 또는 name)를 직렬화하여 마이크로서비스 간에 역직렬화가 일치하지 않았습니다.