2008-11-10 80 views
7

我一直在閱讀Systemsetget方法的細節,但參數通常是字符串。Java:`enum` vs`String`作爲參數

您是否考慮使用String作爲參數錯誤的做法,因爲包含enum

最好的替代方案可能是public final String,不是嗎?

回答

18

我會考慮枚舉是比字符串更好的方法。它們是類型安全的,比較它們比比較字符串更快。

作爲Java 1.5之前的替代品,您可以使用Joshua Bloch在他的書Effective Java中提出的類型安全的枚舉模式。對於類型安全的枚舉請參見http://www.javacamp.org/designPattern/enum.html

5

僅僅因爲你聲明public final String的東西,你希望有傳入的參數的方法,並沒有什麼東西傳遞任何我喜歡阻止我。

使用enum s意味着我無法創建自己的對象來傳入,從而保護問題的雙方。我認爲你應該使用常量字符串代替枚舉的唯一時間是如果你需要爲用戶提供空間來擴展你的方法來啓用自定義功能......

+0

@Martin:我想要比較輸入的字符串常量,否則拋出一個無效的輸入異常,不好。由於開放鍵的建議,我問了這個問題,這似乎減少了Java內部的WORA概念。 – 2008-11-15 05:38:32

4

如果你指的是System.setProperty (),System.getProperty()或System.getenv(),我認爲字符串在這裏是合適的,因爲這組可能的鍵是開放的。關鍵參數對應於某個文件或某處存儲的實際文本/字符串類型值。

如果你有一組密鑰,我認爲枚舉會更受歡迎。

+0

我的想法是,一個枚舉可以有非平臺特定設置的映射細節,這兩個應該不僅用於字符串,並且該字符串方法應該被棄用以鼓勵採用枚舉 – 2008-11-10 09:17:31

+0

我認爲區別「關閉」鍵集和「打開」鍵集是這裏最重要的因素。如果您使用動態加載的插件查看API,則插件可能會提供可通過String參數訪問的其他功能,但使用枚舉會更困難。 – 2008-11-10 16:18:14

0

字符串在現有API中的使用是不錯的做法;僅僅因爲Java現在支持枚舉而改變API是不好的做法。對於新的API,我同意其他人所說的。

12

如果您的參數組在編譯時有限且已知,請使用enum

如果你的參數集在編譯時是打開的或未知的,則使用字符串。

1

儘管使用枚舉是類型安全的,但是將enum轉換爲字符串的需求卻相當頻繁。 Java中沒有內置的功能。最終你最終會使用valueOf()和toString()。使用這種方法與僅使用字符串沒有多大區別。因爲你需要處理字符串不能轉換爲Enum的情況。

因此,只使用靜態最終字符串很容易,是一種常見的做法,AFAIK。

例如,您需要使用某些API與服務器進行交互。您需要將每個方法和響應定義爲Enum。然後你需要添加toString和valueOf方法。爲什麼不使用String?