2012-09-14 27 views
16

Trong tuyên bố if của tôi, tôi muốn so sánh một biến, đó là một JDK 1,5 enum, với một enum literal. Ví dụ:Freemarker: một enum trong một tuyên bố nếu

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

Nhưng tôi nhận được ngoại lệ này:

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) 

Làm thế nào tôi có thể làm điều đó?

Trả lời

18

Thật không may, ngôn ngữ Freemarker không có khái niệm về lớp ... nhưng bạn có thể làm điều này :

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

Hoặc nếu bạn tin tưởng toString() cho kiểu enum, phần .name() có thể được bỏ qua.

1

Nếu bạn muốn so sánh enums bạn nên xác định một giá trị enum liên tục trong dấu ngoặc kép như:

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

Điều đó có tác dụng nhưng không tái cấu trúc thân thiện. Nếu enum ghi đè lên phương thức toString() thì sao? –

1

Tôi đã sử dụng một cái gì đó như thế này thành công (trong java 1.6 và 1.7, đã không cố gắng 1.5):

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

Đây là với enum bên trong một lớp học như:

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

Và kiểu biến được định nghĩa trong java một cái gì đó như:

TypeEnum type = TypeEnum.BEST_SOLUTION_CHANGED; 
Các vấn đề liên quan