2012-09-14 17 views
16

Nella mia istruzione if, voglio confrontare una variabile, che è un enum JDK 1.5, ad un enum letterale. Per esempio:Freemarker: un enum in una dichiarazione if

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

Ma ottengo questa eccezione:

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) 

Come posso fare questo?

risposta

18

Purtroppo, la lingua FreeMarker non ha il concetto di classi ... ma si può fare questo :

<#if type.name() == "BEST_SOLUTION_CHANGED"> 
    ... 
</#if> 

Oppure, se si considera attendibile il toString() per il tipo enum, la parte .name() può essere omessa.

1

Se si desidera confrontare le enumerazioni è necessario specificare un valore enum costante tra virgolette come:

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

Questo funziona, ma non è il refactoring amichevole. Cosa succede se l'enum sovrascrive il metodo toString()? –

1

ho usato qualcosa di simile con successo (in Java 1.6 e 1.7, non hanno provato 1.5):

<#if type?? && statics["com.your.package.ContainingClass$TypeEnum"].BEST_SOLUTION_CHANGED.equals(type)> 
    Do some freemarker or HTML here 
</#if> 

Questo è con enum all'interno di un'altra classe come:

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; 
    } 
    }; 
} 

e tipo di variabile è definito in java qualcosa del tipo:

TypeEnum type = TypeEnum.BEST_SOLUTION_CHANGED; 
Problemi correlati