2012-12-13 19 views
3

我很Java和我用枚舉,第一次是這樣的:如何正確使用Enum?

public class Web { 
     public String baseUrl; 
     public static enum Environment { 

      DEVELOPMENT("http://development") , 
      PRODUCTION("http://production"), 
      SANDBOX("http://sandbox"); 

      public final String baseUrl; 

      private Environment(String baseUrl) 
      { 
       this.baseUrl = baseUrl; 
      } 
     } 
    } 

枚舉Environment有三個常量DEVELOPMENTPRODUCTIONSANDBOX。該Web類也有baseUrlEnvironmentbaseUrl被設置(不知道這是這樣做的好做法)。

有關設置baseUrl我正在做這樣的:

new Web().setBaseUrl(Web.Environment.PRODUCTION.baseUrl) 

我不知道這是用枚舉與類的正確方法。有什麼辦法可以直接設置WebbaseUrl來枚舉baseUrl

我在這裏錯過了什麼。

在此先感謝

回答

3

我認爲你是在正確的軌道上,但是通過以這種方式訪問​​URL,你正在失去Java enum的一些優勢。相反,使用枚舉的類型可以幫助確保將正確的值傳遞給您的方法。也就是說,單獨傳遞枚舉,並讓方法從中提取任何值。例如:

new Web().setEnvironment(Web.Environment.PRODUCTION); 

現在,您只能將環境傳遞到您的Web類,而不是任何ol字符串。

[編輯]那麼你Web.setEnvironment方法是這樣的:

public void setEnvironment(Environment environment) { 
    this.baseUrl = environment.getBaseUrl(); 
} 

這樣,我不能一起去,並通過調用事故new Web().setEnvironment("marvo")。它強化了一定程度的正確性。

而vishal_aim是正確的。即使使用Enums,您也應該練習數據隱藏和封裝,所以要使實例變量保密,並提供像getBaseUrl()這樣的訪問器來檢索值。

+0

感謝您的回覆。如果我通過'Web.Environment.PRODUCTION'。我只接收'PRODUCTION'作爲輸出而不是'url'。 – sriram

+0

我加了一點解釋來說明我的意思。希望能幫助到你。 – Marvo

+0

謝謝。這真的幫助了我。 – sriram

2

而不是直接使用枚舉的成員baseUrl你應該讓私人和有枚舉類getter方法。除此之外,我認爲這樣可以使用枚舉

1

使枚舉成爲頂級類/枚舉。
爲baseUrl字段添加一個吸氣劑。

+1

但是如果它只用於'Web'類,那麼在這個類中聲明它有什麼危害? –

+0

@vishal_aim我嚴重懷疑這將是唯一的用途。測試課程,心跳過程可能需要在使用完整URL之前ping服務器等 – Bohemian

1

我認爲你如何使用Enum沒有任何問題。但是代碼看起來有點笨拙:

new Web().setBaseUrl(Web.Environment.PRODUCTION.baseUrl) 

我想借此枚舉出Web類,並省略多餘「的baseUrl」字段中Web類 - 你不需要它,因爲你有你的枚舉值。而不是baseUrl我會有一個Environment類型的urlType成員。也將是不錯的方法添加訪問到baseUrlEnvironment枚舉

0

內隨着波希米亞什麼和vishal_aim說,你可能會不必要地暴露的baseUrl成員(或您重構它在後getBaseUrl()方法)。相反,將枚舉傳遞給Web類並讓它從枚舉中挖掘URL。這樣,如果您將枚舉保留在Web類中,則可以保持baseUrl爲私有。

public void setEnvironment(Environment env) { 
    baseUrl = env.getBaseUrl(); 
    .... 
}