私のifステートメントでは、JDK1.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)
どうやってやるの?
残念ながら、FreeMarker言語にはクラスの概念がありません...しかし、これを行うことができます:
_<#if type.name() == "BEST_SOLUTION_CHANGED">
...
</#if>
_
または、列挙型のtoString()
を信頼する場合は、.name()
の部分を省略できます。
列挙型を比較する場合は、次のように二重引用符で定数列挙値を指定する必要があります。
<#if type == "BEST_SOLUTION_CHANGED">
...
</#if>
私はこのようなものをうまく使用しました(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;