programing

Java 열거형에서 valueof() 및 toString()을 덮어씁니다.

goodjava 2022. 10. 23. 21:26

Java 열거형에서 valueof() 및 toString()을 덮어씁니다.

나의 가치관은enum공백이 필요한 단어입니다만, enum의 값에는 공백이 들어갈 수 없기 때문에 모두 묶습니다.덮어쓰기를 원합니다.toString()내가 말하는 곳에 이 공간을 더하는 거야

또한 사용할 때 열거형이 올바른 열거형을 제공하기를 원합니다.valueOf()같은 문자열에 공백이 추가되어 있습니다.

예를 들어 다음과 같습니다.

public enum RandomEnum
{
     StartHere,
     StopHere
}

불러toString()RandomEnum그 가치는StartHere문자열 반환"Start Here".불러valueof()같은 스트링("Start Here")는 열거값을 반환합니다.StartHere.

이거 어떻게 해?

이 코드를 사용해 보세요.덮어쓸 수 없기 때문에valueOf커스텀 메서드를 정의해야 합니다.(getEnum필요한 값을 반환하고 대신 이 메서드를 사용하도록 클라이언트를 변경합니다.

public enum RandomEnum {

    StartHere("Start Here"),
    StopHere("Stop Here");

    private String value;

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

    public String getValue() {
        return value;
    }

    @Override
    public String toString() {
        return this.getValue();
    }

    public static RandomEnum getEnum(String value) {
        for(RandomEnum v : values())
            if(v.getValue().equalsIgnoreCase(value)) return v;
        throw new IllegalArgumentException();
    }
}

이것을 시험해 보세요.다만, 어느 곳에서나 효과가 있는 것은 아닙니다.

public enum MyEnum {
    A("Start There"),
    B("Start Here");

    MyEnum(String name) {
        try {
            Field fieldName = getClass().getSuperclass().getDeclaredField("name");
            fieldName.setAccessible(true);
            fieldName.set(this, name);
            fieldName.setAccessible(false);
        } catch (Exception e) {}
    }
}

열거형에서 Strings를 열거형 상수에 매핑하는 정적 Map을 사용할 수 있습니다.getEnum' 정적 메서드에서 사용합니다.그러면 String 값에서 enum을 가져올 때마다 enum을 반복할 필요가 없어집니다.

public enum RandomEnum {

    StartHere("Start Here"),
    StopHere("Stop Here");

    private final String strVal;
    private RandomEnum(String strVal) {
        this.strVal = strVal;
    }

    public static RandomEnum getEnum(String strVal) {
        if(!strValMap.containsKey(strVal)) {
            throw new IllegalArgumentException("Unknown String Value: " + strVal);
        }
        return strValMap.get(strVal);
    }

    private static final Map<String, RandomEnum> strValMap;
    static {
        final Map<String, RandomEnum> tmpMap = Maps.newHashMap();
        for(final RandomEnum en : RandomEnum.values()) {
            tmpMap.put(en.strVal, en);
        }
        strValMap = ImmutableMap.copyOf(tmpMap);
    }

    @Override
    public String toString() {
        return strVal;
    }
}

맵의 정적 초기화가 열거 상수의 선언보다 낮게 발생하는지 확인하십시오.

BTW - 그 'Immmable Map' 타입은 Google guava API에서 가져온 것이며, 저는 이런 경우에 그것을 꼭 추천합니다.


편집 - 코멘트별:

  1. 이 솔루션에서는 할당된 각 문자열 값이 고유하고 늘이 아닌 것으로 가정합니다.열거형 작성자가 이를 제어할 수 있고 문자열이 일의 및 null이 아닌 열거형 값에 대응한다는 점을 고려하면 이는 안전한 제한으로 보입니다.
  2. 질문에서 요청한 대로 'toSTRING' 메서드를 추가했습니다.

Java 8의 실장은 어떻습니까?(늘은 기본 Enum으로 대체할 수 있습니다.)

public static RandomEnum getEnum(String value) {
    return Arrays.stream(RandomEnum.values()).filter(m -> m.value.equals(value)).findAny().orElse(null);
}

또는 다음을 사용할 수 있습니다.

...findAny().orElseThrow(NotFoundException::new);

여기서부터의 가치 Of ('시작')를 얻을 수 있다고는 생각하지 않습니다.하지만 우주에 관한 한...다음을 시도합니다...

static private enum RandomEnum {
    R("Start There"), 
    G("Start Here"); 
    String value;
    RandomEnum(String s) {
        value = s;
    }
}

System.out.println(RandomEnum.G.value);
System.out.println(RandomEnum.valueOf("G").value);

Start Here
Start Here

다음은 valueOf()의 대체 수단입니다.

public static RandomEnum getEnum(String value) {
  for (RandomEnum re : RandomEnum.values()) {
    if (re.description.compareTo(value) == 0) {
      return re;
    }
  }
  throw new IllegalArgumentException("Invalid RandomEnum value: " + value);
}

다음 항목을 열거형으로 구현할 수 있는 옵션이 있습니다.

public static <T extends Enum<T>> T valueOf(Class<T> enumType, String name){...}

언급URL : https://stackoverflow.com/questions/9662170/override-valueof-and-tostring-in-java-enum