2012-09-14 86 views
16

在我的if語句中,我想比較一個變量,它是一個JDK 1.5枚舉,枚舉文字。例如:Freemarker:if語句中的枚舉

<#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) 

我怎樣才能做到這一點?

回答

18

不幸的是,FreeMarker的語言沒有的類的概念......但你可以做到這一點:

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

或者,如果你的枚舉類型信任toString(),可以省略.name()部分。

1

如果你想比較枚舉應指定在雙引號像一個常數枚舉值:

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

這是有效的,但它不是重構友好的。如果枚舉覆蓋toString()方法會怎麼樣? –

1

我用這樣的成功(在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;