Freemarker: перечисление в выражении if
В моей инструкции if я хочу сравнить переменную, которая представляет собой перечисление JDK 1.5, в литерал перечисления. Например:
<#if type == ProblemStatisticType.BEST_SOLUTION_CHANGED>
...
</#if>
Но я получаю это исключение:
freemarker.core.InvalidReferenceException: Expression ProblemStatisticType is undefined on line 430, column 87 in index.html.ftl.
at freemarker.core.TemplateObject.assertNonNull(TemplateObject.java:125)
at freemarker.core.TemplateObject.invalidTypeException(TemplateObject.java:135)
Как я могу это сделать?
Ответы
Ответ 1
К сожалению, язык FreeMarker не имеет понятия классов... но вы можете это сделать:
<#if type.name() == "BEST_SOLUTION_CHANGED">
...
</#if>
Или, если вы доверяете toString()
для типа перечисления, часть .name()
может быть опущена.
Ответ 2
Если вы хотите сравнить перечисления, вы должны указать постоянное значение enum в двойных кавычках, например:
<#if type == "BEST_SOLUTION_CHANGED">
...
</#if>
Ответ 3
Я успешно использовал что-то подобное (в java 1.6 и 1.7, не пробовал 1.5):
<#if type?? && statics["com.your.package.ContainingClass$TypeEnum"].BEST_SOLUTION_CHANGED.equals(type)>
Do some freemarker or HTML here
</#if>
Это с перечислением внутри другого класса, например:
class ContainingClass {
public enum TypeEnum {
WORST(0),
BEST_SOLUTION_CHANGED(1);
private int value;
private TypeEnum(int value) {
this.value = value;
}
public int value() {
return this.value;
}
};
}
И переменная типа определена в java примерно так:
TypeEnum type = TypeEnum.BEST_SOLUTION_CHANGED;