Java Generic Enum

By | 2022년 11월 9일
Table of Contents

Java Generic Enum

Java Enum 은 내부적으로 Enum class 를 이미 상속하고 있기 때문에,
다른 클래스를 상속할 수 없어, 기본적으로 Generic 을 구현할 수 없습니다.

하지만, interface 를 이용해 유사한 기능을 구현할 수 있습니다.

interface 생성

getEnumConstants() 를 이용해 값으로부터 Enum 을 생성할 수 있습니다.

public interface BaseEnum<V> {

    V getValue();

    static <E extends Enum<E> & BaseEnum<ID>, ID> E fromValue(ID value, Class<E> type) {
        if (value == null) {
            return null;
        }

        for (E e : type.getEnumConstants()) {
            if (e.getValue().equals(value)) {
                return e;
            }
        }

        return null;
    }
}

Enum 생성

String 으로 저장되는 Enum

public enum YNType implements BaseEnum<String> {

    Y("Y"),
    N("N");

    private final String value;

    YNType(String value) {
        this.value = value;
    }

    @Override
    public String getValue() {
        return value;
    }

    public static YNType fromValue(String value) {
        return BaseEnum.fromValue(value, YNType.class);
    }
}

Integer 로 저장되는 Enum

public enum StatusType implements BaseEnum<Integer> {
    BAD(1),
    GOOD(2),
    UNKNOWN(3);

    private final Integer value;

    StatusType(int value) {
        this.value = value;
    }

    @Override
    public Integer getValue() {
        return value;
    }

    public static StatusType fromValue(Integer value) {
        return BaseEnum.fromValue(value, StatusType.class);
    }
}

사용법

YNType ynType1 = YNType.Y;
YNType ynType2 = YNType.fromValue("Y");

StatusType statusType1 = StatusType.GOOD;
StatusType statusType2 = StatusType.fromValue(1);

System.out.println(ynType1);
System.out.println(ynType2);

System.out.println(statusType1);
System.out.println(statusType2);
System.out.println(statusType2.getValue());

답글 남기기