2011-02-24 211 views
1

只想就此事提出一些意見。我一直使用int標誌,如果我要使用枚舉,只是對可能的易用性表示感到好奇?枚舉vs int標誌?

在此先感謝 〜Aedon

+2

你說什麼語言呢?例如,在C#中它們是一樣的。 – 2011-02-24 17:07:30

回答

12

我很懷疑你會看到性能好處 - 在某些情況下甚至會出現性能下降,這取決於你如何使用它們。我懷疑他們會很重要。

好處不在於性能方面 - 它更清楚地表達或表達您的意圖,從而提高可讀性(和類型安全性)的代碼。例如,對於整數標誌,如果您嘗試在方法調用中使用(比如說)HTTP_STATUS_UNAUTHORIZED作爲文件共享模式的值,則沒有任何事情會抱怨...但是如果這兩者都是枚舉,則該參數將被強制鍵入爲真的只允許文件共享模式(或空,假設你談論Java)。

+0

謝謝您的回覆;並注意到。 – AedonEtLIRA 2011-02-24 17:45:20

5

枚舉更清晰地表達你正在嘗試做什麼。使用它們,不用擔心性能;性能影響可以忽略不計。

0

它們基本上是一樣的東西,除非枚舉是自我記錄的。我建議一旦其他人可能與您的代碼聯繫,就使用枚舉。

+3

Java枚舉與整數非常不一樣。他們比這更強大(而且比大多數其他語言中的枚舉更強大)。 – 2011-02-24 17:11:06

+0

你說得對,他們更強大,是類型安全的。我可能沒有充分表達的是,用枚舉明顯替換int標誌將產生相同的結果,除了以更可讀的方式。 – 2011-02-24 17:14:41

0

一個Enum類型有自己的方法和optimized containers。你應該比int標記更喜歡它,因爲它更安全並且可能更有效率(儘管我懷疑它中有很多!)。

0

除了類型安全的代碼,你有一個參考共享集合(可重用性)

1

使用位掩碼標誌的相當於是使用EnumSet(這恰好使用位面罩)

enum Colour { RED, GREEN, BLUE } 
Set<Colour> colours = EnumSet.noneOf(Colour.class); 
colours.add(Colour.RED); 
colours.add(Colour.GREEN); 
if (colours.contains(Colour.RED)) // true 
    System.out.println(colours+" contains RED"); 

if (colours.contains(Colour.BLUE)) // false 
6

像往常一樣,Effective Java最好說它:使用該int枚舉 模式

程序是易碎的。因爲int 枚舉是編譯時常量,所以它們 被編譯到使用 它們的客戶端中。如果與 枚舉常量關聯的int更改了,則必須重新編譯其客戶端 。如果它們不是, 它們仍然會運行,但它們的 行爲將是未定義的。

有 不容易的方法將int枚舉 常量轉換成可打印的字符串。如果 您打印這樣一個常數或從調試器顯示它 ,你看到的只是一個 數字,這不是很有幫助。 有迭代 在所有int枚舉常數在 基,或甚至以獲得 一個int枚舉組大小沒有可靠的方法。

(+ 10多頁的爲什麼枚舉更好:-))

來源:Item 30: Use enums instead of int constants

+0

謝謝你,這是高度描述性的。 – AedonEtLIRA 2011-02-24 19:20:43