web-dev-qa-db-ja.com

Android:列挙型vs静的最終整数?

Java Androidアプリケーションでstatic final intsのセットを使用することに対して、enumを使用することの利点(または欠点)は何ですか?どちらか一方の使用を好む、効率またはパフォーマンスの最適化が発生しますか?

私はこれをインテントrequestCodesなどのコンテキストで尋ねます-これは、Cで使用されていたenumからの値とは対照的に、Androidサンプルコードではintになる傾向があります。

31
Cubic

列挙型の利点 この質問

  • これらは、整数、文字列、ブールフラグのセットよりもはるかにタイプセーフです。
  • それらはより読みやすいコードにつながります。
  • Enumを無効な値に設定することは、intまたはstringよりも困難です。
  • これらを使用すると、変数またはパラメーターに許可されている値を簡単に見つけることができます。
  • 私が読んだすべては、それらがC#およびほとんどのJVMで整数と同様に機能することを示しています。

追加します:

  • 列挙型はメンバー変数とインスタンス変数を持つことができますが、intは持つことができません。

ほとんどの抽象化と同様に、 パフォーマンスが追いついた になると、それらは一般に明確に有利になります。特にフレームワークコードではなく、アプリケーションコードでは、列挙型をシミュレートする他のメソッドよりも列挙型を選択します。

29
Matthew Willis

個人的な経験からの非常に単純な答えは、Enumsがはるかに優れた型安全性を提供する、つまり、コンパイラーがコードのバグをなくす上でより積極的な役割を果たすことです。

一方、列挙型はオブジェクトの世界の「二流市民」であるため、特にジェネリックが含まれる場合、現在一般的に使用されているより微妙な設計パターンの一部で使用するのは難しい場合があります。

そして最後に、ビットフィールドでstatic final intを使用できます。列挙型では次のことはできません。

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

まあ... ハゲ男 によると、列挙型は 本当にメモリに悪い です。

@ 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);
7
Cheborra

Enumに対するintの利点の1つは、クラスファクトリです。次の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
        }
    }

私はこの貧弱なコードを書きました。デザインパターンを確認すると、4人のギャングはintを使用しました。 ここ を回復しようとしました。

3
JAL