2014-01-24 31 views
2

我正在使用JAX-RS創建REST Web服務。如何在Java中強制使用常量

我需要在我的Resource類上公開訪問@Path註釋的值。使用反射來獲得這個值似乎有點沉重。

我想我會保留在public static final String的值,以便它可以通過@Path註釋和其他類訪問。

要求一個類提供這個常量的最佳方式是什麼?我的印象是在界面中使用常量是一種反模式(Effective Java 2nd Edition)。

編輯:

正如指出有效的Java說:「如果常數強烈依賴於現有的類或接口,你應該將它們添加到類或接口」。

在我的情況下,@Path對於接口的所有實現者都是一樣的,接口將提供方法,所以我認爲我可以安全地將常量添加到接口。

+0

添加一個getter方法到私人領域? – Mikhail

+5

有效的java並不是說在一個接口中使用常量是一種反模式。它說使用一個僅用於常量的接口是一種反模式,「常數接口」是一種反模式。 – eis

回答

5

既然你已經有了the book,我會引用它爲你(第98-99):

如果你要導出contants,有幾個合理的選擇。 如果常數與現有類或接口緊密相關,則應將它們添加到類或接口中。例如,所有裝箱的數字原語類(如Integer和Double)均會導出 MIN_VALUE和MAX_VALUE個常量。如果常量最好視爲枚舉類型的成員,則應該使用枚舉類型 將其導出。否則,您應該使用 非實用工具類導出常量。


然而,以上出口常數交易的答案。如果你想「要求一個類提供這個常量」,這是一個不同的事情,並且在你的界面中有常量不會這樣做。只有這樣你才能強制執行這樣的事情,就是在你的界面中有一個吸氣劑。

+0

+1特別是對於**否則,你應該導出常量與一個noninstantiable工具類** –

+0

我認爲如果我有一個getter在我的界面,我無法訪問它在我的@路註解? – retrodev

+0

@retrodev沒有這方面的經驗,但我的猜測是你應該可以訪問它。 – eis

0

如果這是一個選項,您可以簡單地將功能添加爲一個簡單的方法。 static有繼承問題,並不總是一個好主意。

interface HasPath { 
    String getPath(); 
} 

class Foo implements HasPath { 
    private static final String PATH = "/my/path"; 

    @Override 
    public void String getPath() { 
     return PATH; 
    } 

    @Annotated(PATH) void foo() { } 
}