在Java Android應用程序中擁有enum
而不是擁有一組static final int
的優點(或缺點)是什麼?是否存在有利於使用其中一種或另一種的效率或性能優化?Android:enum vs static final ints?
我在上下文問這個說意圖requestCodes並且這樣的 - 這往往是在Android示例代碼整數,如從一個枚舉,我被用來在從C.
在Java Android應用程序中擁有enum
而不是擁有一組static final int
的優點(或缺點)是什麼?是否存在有利於使用其中一種或另一種的效率或性能優化?Android:enum vs static final ints?
我在上下文問這個說意圖requestCodes並且這樣的 - 這往往是在Android示例代碼整數,如從一個枚舉,我被用來在從C.
枚舉的優點相對值this question:
- 他們更類型安全不是整數,字符串或集不 標誌。
- 它們導致更具可讀性的代碼。
- 將枚舉設置爲無效值比int或 字符串更困難。
- 它們可以很容易地發現變量或 參數的允許值。
- 我讀過的所有內容都表明它們在C#和大多數JVM中的執行效果與整數 一樣好。
我想補充:
int
不能。與大多數抽象一樣,一旦它們的performance catches up一致,它們一般都是非常有利的。特別是在您的應用程序代碼(而不是框架代碼)中,我會選擇其他方法的枚舉來模擬它們。
感謝您的鏈接回覆:Android的文檔,我讀了一段時間了,一直在想這件事。 – Ozzy 2013-06-28 22:36:31
個人經驗的一個非常簡單的答案是,枚舉提供更好的類型安全性,換句話說,編譯器可以發揮更積極的作用,讓代碼無bug。另一方面,由於枚舉是對象世界的「二等公民」,因此它們可能很難用於當今常用的一些更微妙的設計模式中,特別是涉及泛型時。
最後,您可以在位域中使用靜態最終整數。你不能用一個枚舉做以下事情:
int selectedOptions = Options.OPTION1 | Options.OPTION2 | Options.OPTION3;
雖然我接受正確的回答問題的第一反應,我覺得你調出最後一點其實是很不錯的。我從來沒有嘗試過,但這是一個很好的事實。謝謝! – Cubic 2011-03-10 00:49:51
在最後一部分,使用EnumSet是推薦的方法。我從來不喜歡比特旗模式。 – Spektr 2011-12-04 04:41:21
類型安全是一件大事。你可以得到所有枚舉類型安全的好處,同時保留向後兼容現有的代碼,通過運行一個靜態分析,如[假枚舉檢查(https://types.cs.washington.edu/checker-framework/電流/檢驗器 - 框架-manual.html#fenum檢查工具)。如果您不關心與現有代碼的向後兼容性,那麼使用枚舉通常會更好。 – mernst 2016-09-03 21:37:29
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。
呃...根據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);
枚舉可以爲null,整數不能 – Erik 2011-03-09 21:38:06
參見[爲什麼不使用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
寫可以先乾淨的方式代碼?;那麼,如果你發現有性能問題,你會發現它不是IO,考慮將你的代碼性能的緣故 – iluxa 2011-03-09 21:47:38