Java 比较thymeleaf中的枚举常数

Java 比较thymeleaf中的枚举常数,java,spring,thymeleaf,Java,Spring,Thymeleaf,我有一个枚举,常量: enum Constants { ONE,TWO,THREE; } 如何比较Thymeleaf中的枚举常量 谢谢。要与枚举常量进行比较,请使用以下代码: th:if="${#strings.toString(someObject.constantEnumString) == 'ONE'}"> th:if="${day == T(my.package.MyEnum).MONDAY}" 如果不想将枚举转换为对象中的字符串,可以按如下方式执行: th:if="

我有一个枚举,
常量

enum Constants {
    ONE,TWO,THREE;
}
如何比较Thymeleaf中的枚举常量


谢谢。

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

th:if="${#strings.toString(someObject.constantEnumString) == 'ONE'}">
th:if="${day == T(my.package.MyEnum).MONDAY}"

如果不想将枚举转换为对象中的字符串,可以按如下方式执行:

th:if="${#strings.defaultString(someObject.myConstant, 'DEFAULT_VALUE') == 'ONE'}"
还有一种方法:

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

它较短,但与字符串表示法相比,可能会在重构时导致问题

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

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

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

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 }
} 
下一步是将包装器的新实例添加到模型中

models.add("constantsWrapper", ConstantsWrapper.instance);
现在,您可以在thymeleaf模板中对
常量的每个值进行类型安全访问

th:if="${value == constantsWrapper.getONE()}"
我知道这个解决方案需要编写更多的源代码并创建一个instance。
Advantage比调用
T()
并将完整限定名直接写入模板更安全。使用此解决方案,您可以在不测试模板的情况下进行重构。

另一个选项是在开关中使用枚举的方法name()。例如:

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

th:if="${ day.toString() == 'MONDAY'}"
我倾向于将
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}”
示例#1:

解决方案:

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

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


示例2:

解决方案:

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

th:if="${string == T(com.example.Constants).ONE.toString()}"
th:if="${string == T(com.example.Constants).ONE.toString()}"
th:if="${'One' == T(com.example.Constants).ONE.getName()}"
注意:当枚举有描述时,必须使用
.toString()


示例#3:

解决方案:

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

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

注意:
.getName()
调用枚举描述正如其他答案所提到的,“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>

星期一快乐!
TGIF!

您是如何比较的?只需使用
=
来比较枚举。@TimBü这是一个用于访问类级(静态)字段或方法的运算符,它是SpEL(Spring表达式语言)的一部分。有关更多信息,请参见类型部分()。谢谢,先生!您节省了我的时间。)当您重构枚举包时,这将给您带来问题。虽然此代码段可能会解决问题,但它没有解释为什么或如何回答此问题。请,因为这确实有助于提高你的文章质量。请记住,您将在将来回答读者的问题,这些人可能不知道您的代码建议的原因。标记者/审阅者:请在您所指的答案下以评论的形式发布此类信息,而不是作为不同的答案。只有当它自己回答问题(你可以考虑你的答案是否可以被改写成一个正确的答案,尽管我想也许不是)。@ TiBi即使你的IDE不支持模板重构(ItILLJ想法,我认为,支持),如果你将使用Nick的答案,你会在页面渲染期间获得EnUM值的检查。在这种情况下-不是,这是较短形式的价格。我想说这是最好的答案。.name()保存了我的日期bcz在我的情况下,它将枚举与字符串进行比较,当我添加时,它总是错误的。name()它起作用。我建议如果isXX()或hasXX()方法添加更高级别的语义(例如,一周中的几天是isWeekend()),则isXX()或hasXX()方法是有用的,但如果他们仅仅确定了价值,那就显得多余了。因为这个值已经表示它自己了。@ThomasW我不同意。它允许在模板中使用更简洁、更可读的语法。例如,您可以使用简明的
th:if=“${day.monday}”
而不是极其冗长和丑陋的
th:if=“${day==T(my.package.MyEnum.monday}”
Hi@daiscog。我想我理解你的观点——如果模板是使用枚举的主要地方,这会使编码更容易。然而,我觉得在这一点上,百里香正在让我们失望;在理想情况下,我们不需要重新声明枚举是什么,也不需要使用如此难看的语法进行比较。谢谢@ThomasW是的,我完全同意如果Thymeleaf使检查枚举更容易,那么我们就不必这样做了。