2017-08-08 29 views
1

使用價值註釋參數

enum Operations { 
OPERATION_NAME("operation/path");  
    private final String path; 

    Operations(String path) { 
     this.path = path; 
    } 

    public String path() { 
     return path; 
    } 
} 

我想在我的REST API方法

@Path(Operations.OPERATION_NAME.path()) 
    void operation() { 
    } 

但Java編譯器上標註使用路徑值抱怨

屬性值必須爲常數

有沒有辦法解決在java8中?

我知道我可以有一個枚舉操作名稱和一堆帶路徑的靜態字符串字段(靜態字符串可以用作@Path註釋中的屬性),但我不喜歡這種方法。

+0

Annotation屬性值必須在編譯時計算,而enum實例只能在運行時計算。 –

+1

@UsagiMiyamoto不是'enum'而是方法。 'Enum'可以用作註釋的參數 – ByeBye

+0

實例無法在編譯時進行評估,因爲它們在類加載時創建它們的引用... –

回答

1

不能使用在註釋參數枚舉的方法,但你可以創建類:

public final class Operations { 

    private Operations() {}; 

    public static final String op1 = "operation/path"; 
    public static final String op2 = "operation2/path"; 

    public enum Enum { 

     OPERATION1(op1), 
     OPERATION2(op2); 

     private final String path; 

     Enum(final String path) { 
      this.path = path; 
     } 

     public final String path() { 
      return path; 
     } 
    } 

} 

會有不重複,你仍然可以使用您的枚舉和以前一樣,和annotatios

static String文字
+0

OP寫道他們不喜歡'enum'中的'static'字段方法......你認爲他們希望在單獨的'class'中隱藏'enum'嗎? –

+0

不完美,但它似乎沒有更好的選擇。我不能在enum上調用操作名稱作爲方法調用。我必須有靜態字符串。所以現在,至少我看到所有這些靜態字符串都被使用(在操作枚舉中) –

+0

@UsagiMiyamoto我只是提供了一種如何將枚舉與靜態字符串字段連接的方法。沒有更好的辦法 – ByeBye