比较百里香的枚举常数

时间:2014-07-24 15:06:36

标签: java spring thymeleaf

我有一个枚举,Constants

enum Constants {
    ONE,TWO,THREE;
}

如何比较Thymeleaf中的枚举常量。

感谢。

11 个答案:

答案 0 :(得分:73)

要与枚举常量进行比较,请使用以下代码:

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

答案 1 :(得分:29)

还有一种方法:

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

它更短但与字符串表示进行比较,在重构时可能会导致问题。

答案 2 :(得分:7)

@Nick的答案有一个小的语法错误,它缺少最后一个大括号。它应该是

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

答案 3 :(得分:6)

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

答案 4 :(得分:4)

另一种选择是在交换机中使用枚举的方法name()。一个例子是:

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

它类似于Java Switch swith ENUM,而不是像${day == T(my.package.MyEnum).MONDAY}${#strings.toString(someObject.constantEnumString) == 'ONE'}这样的其他答案,看起来很奇怪。

答案 5 :(得分:2)

试试这个:

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

答案 6 :(得分:1)

如果您不想将Enum转换为对象中的字符串,可以这样做:

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

答案 7 :(得分:1)

我倾向于在我的枚举中添加isXXX()方法:

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}"

答案 8 :(得分:0)

我更喜欢在枚举周围使用包装器。

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()}"

我知道这个解决方案需要编写更多源代码并创建一个实例。 Advantage比调用T()更安全,并将完全限定名称直接写入模板。使用此解决方案,您无需测试模板即可进行重构。

答案 9 :(得分:0)

示例1:

nullptr

解决方案:

enum Constants {
    ONE,
    TWO,
    THREE;
}

注意:为了安全起见,您可以使用th:if="${string == T(com.example.Constants).ONE}" OR th:if="${string == T(com.example.Constants).ONE.toString()}"


示例2:

.toString()

解决方案:

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

注意:当您的枚举有Description时,您必须使用th:if="${string == T(com.example.Constants).ONE.toString()}"


示例3:

.toString()

解决方案:

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

注意:th:if="${'One' == T(com.example.Constants).ONE.getName()}" 进行的枚举描述调用。

答案 10 :(得分:0)

正如其他答案所提到的,'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>