2012-09-14 17 views
16

En mi sentencia if, quiero comparar una variable, que es una enum JDK 1.5, con una literal enum. Por ejemplo:Freemarker: una enumeración en una instrucción if

<#if type == ProblemStatisticType.BEST_SOLUTION_CHANGED> 
    ... 
</#if> 

Pero consigo 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?

Respuesta

18

Por desgracia, el idioma FreeMarker no tiene el concepto de clases ... pero se puede 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.

1

Si desea comparar las enumeraciones se debe especificar un valor de enumeración constante entre comillas dobles como:

<#if type == "BEST_SOLUTION_CHANGED"> 
    ... 
</#if> 
+0

Eso funciona, pero no está refactorizando amigablemente. ¿Qué ocurre si el enum sobrescribe el método toString()? –

1

he usado 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> 

Ésta es la 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 tipo de variable se define en java algo así como:

TypeEnum type = TypeEnum.BEST_SOLUTION_CHANGED; 
Cuestiones relacionadas