Freemarker: перечисление в выражении if - программирование
Подтвердить что ты не робот

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)

Как я могу это сделать?

4b9b3361

Ответ 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;