2012-07-31 57 views
8

我看到這個遍佈代碼庫:應該將映射值聲明爲常量還是枚舉?

@RequestMapping(value = "myValue") 

我更願意用這樣的:

@RequestMapping(value = Constants.myValue) 

似乎用實際的字符串值內@RequestMapping,而不是不斷打破乾燥。 但是,這是不錯的代碼練習?我應該使用枚舉嗎? 我可能需要在代碼庫的其他地方使用Constants.myValue

+0

你所說的「打破DRY」是什麼意思?這不工作?你可以發佈我們你的常量類嗎? – jontro 2012-07-31 13:20:16

+0

@jontro通過打破DRY我的意思是:字符串值可能會用在代碼的其他區域,所以值應該分配給一個常量或枚舉。我沒有常量類,這只是我的建議 – 2012-07-31 13:24:36

+0

@ user470184如果這隻適用於請求映射,使用intellij不需要這樣做,因爲它索引請求映射並使它們在適當位置作爲智能文本提供。 – NimChimpsky 2012-10-09 15:09:40

回答

12

我應該使用枚舉嗎?

你不行。註釋變量必須是編譯時常量。枚舉和字符串文字都是,但是你不能創建一個字符串並且需要一個字符串(如果你的枚舉有一個返回一個字符串或字符串字段的方法,那不是一個編譯時常量)的。由於存在多輪註釋處理,因此當常量位於另一個類中時它可以工作。

這就是說,是的,我會說使用一個專用的常量類(也許幾個,對於不同類型的常量)是一個很好的習慣,我只要可以使用它(只要常量a )沒有在具有註解的同一編譯單元內定義,並且b)在聲明中初始化(與靜態初始化塊相對))。

下面是一個例子:

控制器

@Controller @RequestMapping(value = Mappings.CUSTOMER_PAGE) 
public class CustomerPageController{ 
    // methods here 
} 

常量類

public static final class Mappings{ 
    private Mappings(){} 
    public static final String CUSTOMER_PAGE = "path/to/customer/page" 
    // more constants 
} 

這裏有一些版本將無法工作:

a)

@Controller @RequestMapping(value = CUSTOMER_PAGE) 
public class CustomerPageController{ 
    private static final String CUSTOMER_PAGE = "path/to/customer/page"; 
} 

這不會編譯,因爲註釋引用了它所註解類中的常量。這是行不通的,因爲在編譯過程中,註釋在代碼的其餘部分之前在一個單獨的循環中處理,而類需要註釋已經被編譯處理(即註釋和常量之間存在依賴關係)

b)

public static final class Mappings{ 
    private Mappings(){} 
    public static final String CUSTOMER_PAGE; 
    static{ 
     CUSTOMER_PAGE = "path/to/customer/page" 
    } 

    // more constants 
} 

雖然這是一個靜態的最終場,它是不是一個編譯時間常數,因此它不能被用來作爲批註參數

+0

@NimChimpsky它很平凡,見上面 – 2012-07-31 14:16:45

+0

嗯,好吧,我直接想到了一個枚舉。你也可以使映射類引用枚舉 – NimChimpsky 2012-07-31 14:19:44

+1

這個工程雖然:'@RequestMapping(MyController.PATH) public class MyController {0} {0} {0}保護靜態最終字符串路徑=「/ some-path」; ''' – 2015-02-11 20:02:23