java - concatenate - Freemarker: una enumeración en una declaración if
freemarker module (3)
En mi declaración if, quiero comparar una variable, que es una enumeración JDK 1.5, con un enum literal. Por ejemplo:
<#if type == ProblemStatisticType.BEST_SOLUTION_CHANGED>
...
</#if>
Pero me sale esta excepción:
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)
¿Cómo puedo hacer eso?
Desafortunadamente, el lenguaje FreeMarker no tiene el concepto de clases ... pero puedes hacer esto:
<#if type.name() == "BEST_SOLUTION_CHANGED">
...
</#if>
O si confía en el toString()
para el tipo de enumeración, la parte .name()
se puede omitir.
He utilizado algo como esto con éxito (en java 1.6 y 1.7, no he probado 1.5):
<#if type?? && statics["com.your.package.ContainingClass$TypeEnum"].BEST_SOLUTION_CHANGED.equals(type)>
Do some freemarker or HTML here
</#if>
Esto es con enumeración dentro de otra clase como:
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;
}
};
}
Y la variable de tipo se define en java algo como:
TypeEnum type = TypeEnum.BEST_SOLUTION_CHANGED;
Si desea comparar enumeraciones, debe especificar un valor de enumeración constante entre comillas dobles como:
<#if type == "BEST_SOLUTION_CHANGED">
...
</#if>