programing

타임리프의 열거 상수 비교

lastmoon 2023. 9. 14. 23:23
반응형

타임리프의 열거 상수 비교

열거할 게 있어요Constants:

enum Constants {
    ONE,TWO,THREE;
}

Thymeleaf의 열거 상수를 비교하려면 어떻게 해야 합니까?

감사해요.

열거 상수와 비교하려면 다음 코드를 사용합니다.

th:if="${day == T(my.package.MyEnum).MONDAY}"

한가지 방법:

th:if="${constant.name() == 'ONE'}"

길이는 짧지만 문자열 표현과 비교할 수 있어 리팩토링 시 문제가 발생할 수 있습니다.

또 다른 옵션은 스위치에서 열거형의 메서드 이름()을 사용하는 것입니다.예를 들면 다음과 같습니다.

  <th:block th:switch="${imageType.name()}>
     <span th:case="'ONE'"></span>
     <span th:case="'TWO'"></span>
     <span th:case="'THREE'"></span>
  </th:block>

다음과 같은 다른 답변 대신 ENUM을 사용하는 자바 스위치와 유사합니다.${day == T(my.package.MyEnum).MONDAY}아니면${#strings.toString(someObject.constantEnumString) == 'ONE'}아주 이상하게 보이는군요

th:if="${#strings.toString(someObject.constantEnumString) == 'ONE'}">

시도해 보기:

th:if="${ day.toString() == 'MONDAY'}"

다른 답변들이 언급한 것처럼, 'T()' 메서드는 열거형의 멤버에 대한 액세스를 허용하지만 전체 패키지 경로 이름이 필요하므로 상당히 길 수 있습니다.특히 열거형을 여러 번 참조해야 하는 경우에는 이 작업이 다소 번거롭습니다.'th:with'를 사용하면 더 읽기 쉽고 유지보수가 가능합니다.

<div th:with="MyEnum=${T(my.package.MyEnum)}">
    <div th:if="${day == MyEnum.MONDAY}">
        <span>Happy Monday!</span>
    </div>
    <div th:if="${day == MyEnum.FRIDAY}">
        <span>TGIF!</span>
    </div>
</div>

Enum을 개체의 문자열로 변환하지 않으려면 다음과 같이 수행할 수 있습니다.

th:if="${#strings.defaultString(someObject.myConstant, 'DEFAULT_VALUE') == 'ONE'}"

저는 열거형 주변에 포장지를 사용하는 것을 선호합니다.

public class ConstantsWrapper {
    public static final instance = new ConstantsWrapper();
    public Constants getONE() { return Constants.ONE }
    public Constants getTWO() { return Constants.TWO }
    public Constants getTHREE() { return Constants.THREE }
} 

다음 단계는 새로운 Wrapper 인스턴스를 모델에 추가하는 것입니다.

models.add("constantsWrapper", ConstantsWrapper.instance);

이제 각 값에 대한 타임리프 템플릿의 안전한 액세스를 입력할 수 있습니다.Constants.

th:if="${value == constantsWrapper.getONE()}"

이 솔루션은 소스 코드를 더 많이 작성하고 인스턴스를 하나 만들어야 한다는 것을 알고 있습니다.장점은 통화보다 안전한 유형입니다.T()그리고 템플릿에 전체 이름을 직접 적습니다.이 솔루션을 사용하면 템플릿을 테스트하지 않고도 리팩터를 수행할 수 있습니다.

덧붙이는 편입니다.isXXX()나의 enum에 메소드:

enum Constants {
    ONE,TWO,THREE;
    public boolean isOne() { return this == ONE; }
    public boolean isTwo() { return this == TWO; }
    public boolean isThree() { return this == THREE; }
}

그럼, 만약value를 사용할 수 있는 열거형의 인스턴스입니다.th:if="${value.one}".

예제 #1:

enum Constants {
    ONE,
    TWO,
    THREE;
}

해결책:

th:if="${string == T(com.example.Constants).ONE}"
 
   OR

th:if="${string == T(com.example.Constants).ONE.toString()}"

NB: 사용 가능.toString()안전을 위하여


예제 #2:

enum Constants {
    ONE("One"),
    TWO("Two"),
    THREE("Three");
}

해결책:

th:if="${string == T(com.example.Constants).ONE.toString()}"

NB: 열거형에 Description(설명)이 있으면 다음을 사용해야 합니다..toString().


예 #3:

enum Constants {
    ONE("One"),
    TWO("Two"),
    THREE("Three");
}

해결책:

th:if="${'One' == T(com.example.Constants).ONE.getName()}"

NB: 열거형 설명 호출 기준.getName().

언급URL : https://stackoverflow.com/questions/24937441/comparing-the-enum-constants-in-thymeleaf

반응형