2011-03-09 46 views
30

在Java Android應用程序中擁有enum而不是擁有一組static final int的優點(或缺點)是什麼?是否存在有利於使用其中一種或另一種的效率或性能優化?Android:enum vs static final ints?

我在上下文問這個說意圖requestCodes並且這樣的 - 這往往是在Android示例代碼整數,如從一個枚舉,我被用來在從C.

+0

枚舉可以爲null,整數不能 – Erik 2011-03-09 21:38:06

+13

參見[爲什麼不使用Android的更多枚舉?](HTTP: //stackoverflow.com/questions/4822877/why-doesnt-android-use-more-enums)和[爲什麼「避免枚舉如果你只需要INTS」從Android的性能提示刪除?](http://stackoverflow.com /問題/ 5143256 /爲什麼 - 是 - 避免-枚舉,在那裏,你只-需求爲整數,除去從 - 機器人性能)和[如何MUC HX所指的內存就採取枚舉(http://stackoverflow.com/questions/143285/how-much-memory-do-enums-take) – 2011-03-09 21:38:29

+2

寫可以先乾淨的方式代碼?;那麼,如果你發現有性能問題,你會發現它不是IO,考慮將你的代碼性能的緣故 – iluxa 2011-03-09 21:47:38

回答

27

枚舉的優點相對值this question

  • 他們更類型安全不是整數,字符串或集不 標誌。
  • 它們導致更具可讀性的代碼。
  • 將枚舉設置爲無效值比int或 字符串更困難。
  • 它們可以很容易地發現變量或 參數的允許值。
  • 我讀過的所有內容都表明它們在C#和大多數JVM中的執行效果與整數 一樣好。

我想補充:

  • 枚舉可以有成員和實例變量,而一個int不能。

與大多數抽象一樣,一旦它們的performance catches up一致,它們一般都是非常有利的。特別是在您的應用程序代碼(而不是框架代碼)中,我會選擇其他方法的枚舉來模擬它們。

+0

感謝您的鏈接回覆:Android的文檔,我讀了一段時間了,一直在想這件事。 – Ozzy 2013-06-28 22:36:31

12

個人經驗的一個非常簡單的答案是,枚舉提供更好的類型安全性,換句話說,編譯器可以發揮更積極的作用,讓代碼無bug。另一方面,由於枚舉是對象世界的「二等公民」,因此它們可能很難用於當今常用的一些更微妙的設計模式中,特別是涉及泛型時。

最後,您可以在位域中使用靜態最終整數。你不能用一個枚舉做以下事情:

int selectedOptions = Options.OPTION1 | Options.OPTION2 | Options.OPTION3; 
+0

雖然我接受正確的回答問題的第一反應,我覺得你調出最後一點其實是很不錯的。我從來沒有嘗試過,但這是一個很好的事實。謝謝! – Cubic 2011-03-10 00:49:51

+6

在最後一部分,使用EnumSet是推薦的方法。我從來不喜歡比特旗模式。 – Spektr 2011-12-04 04:41:21

+0

類型安全是一件大事。你可以得到所有枚舉類型安全的好處,同時保留向後兼容現有的代碼,通過運行一個靜態分析,如[假枚舉檢查(https://types.cs.washington.edu/checker-framework/電流/檢驗器 - 框架-manual.html#fenum檢查工具)。如果您不關心與現有代碼的向後兼容性,那麼使用枚舉通常會更好。 – mernst 2016-09-03 21:37:29

3

enums與枚舉相比的一個優點是在CLASS FACTORY中。下面的C#代碼是不可擴展的:

class Factory 
{ 
    public enum DrawableType {CIRCLE,SQUARE}; 
    public static Drawable GetInstance(DrawableEnum e) 
    { 
     if (e == DrawableType.CIRCLE) 
     { 
      return new Circle(); 
     } 
     else if (e == DrawableType.SQUARE) 
     { 
      return new Square(); 
     } 
     else 
     { 
      throw new IndexOutOfRangeException(); // should never get here 
     } 
    } 

我寫了這個可憐的代碼。審查設計模式,四人幫使用int。我試圖恢復here

7

呃...根據a bald guy枚舉是really bad for memory

你應該使用@IntDef/@StringDef註釋:

public static final int NAVIGATION_MODE_STANDARD = 0; 
public static final int NAVIGATION_MODE_LIST = 1; 
public static final int NAVIGATION_MODE_TABS = 2; 

@IntDef({NAVIGATION_MODE_STANDARD, NAVIGATION_MODE_LIST, NAVIGATION_MODE_TABS}) 
public @interface NavigationMode {} 

然後

@NavigationMode 
public abstract int getNavigationMode(); 

public abstract void setNavigationMode(@NavigationMode int mode);