簡體   English   中英

Android:enum vs static final int?

[英]Android: enum vs static final ints?

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

我在上下文中詢問了這個請求代碼等等 - 它往往是Android示例代碼中的內容,而不是我在C中習慣的枚舉值。

Enum從這個問題中獲益:

  • 它們比整數,字符串或布爾標志集更加類型安全。
  • 它們導致更易讀的代碼。
  • 將枚舉設置為無效值比使用int或string更困難。
  • 它們可以輕松發現變量或參數的允許值。
  • 我讀過的所有內容都表明它們在C#和大多數JVM中的表現與整數一樣好。

我想補充一下:

  • 枚舉可以包含成員和實例變量,而int則不能。

像大多數抽象一樣,一旦他們的表現趕上 ,它們通常是非常有利的。 特別是在您的應用程序代碼中(而不是框架代碼),我會選擇枚舉而不是其他模擬它們的方法。

從個人經驗中得出的一個非常簡單的答案是,Enums提供了更好的類型安全性,換句話說,編譯器可以在保持代碼bug免費方面發揮更積極的作用。

另一方面,因為Enums是對象世界的“二等公民”,所以它們很難用於當今常用的一些更微妙的設計模式,特別是涉及泛型時。

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

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

嗯......根據一個禿頭男人的說法,Enums 真的很難記憶

你應該使用@ 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);

對枚舉進行整數的一個優點是在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。 我試圖在這里恢復。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM