Java Androidアプリケーションでstatic final int
sのセットを使用することに対して、enum
を使用することの利点(または欠点)は何ですか?どちらか一方の使用を好む、効率またはパフォーマンスの最適化が発生しますか?
私はこれをインテントrequestCodesなどのコンテキストで尋ねます-これは、Cで使用されていたenumからの値とは対照的に、Androidサンプルコードではintになる傾向があります。
列挙型の利点 この質問 :
- これらは、整数、文字列、ブールフラグのセットよりもはるかにタイプセーフです。
- それらはより読みやすいコードにつながります。
- Enumを無効な値に設定することは、intまたはstringよりも困難です。
- これらを使用すると、変数またはパラメーターに許可されている値を簡単に見つけることができます。
- 私が読んだすべては、それらがC#およびほとんどのJVMで整数と同様に機能することを示しています。
追加します:
int
は持つことができません。ほとんどの抽象化と同様に、 パフォーマンスが追いついた になると、それらは一般に明確に有利になります。特にフレームワークコードではなく、アプリケーションコードでは、列挙型をシミュレートする他のメソッドよりも列挙型を選択します。
個人的な経験からの非常に単純な答えは、Enumsがはるかに優れた型安全性を提供する、つまり、コンパイラーがコードのバグをなくす上でより積極的な役割を果たすことです。
一方、列挙型はオブジェクトの世界の「二流市民」であるため、特にジェネリックが含まれる場合、現在一般的に使用されているより微妙な設計パターンの一部で使用するのは難しい場合があります。
そして最後に、ビットフィールドでstatic final intを使用できます。列挙型では次のことはできません。
int selectedOptions = Options.OPTION1 | Options.OPTION2 | Options.OPTION3;
まあ... ハゲ男 によると、列挙型は 本当にメモリに悪い です。
@ 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);
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を使用しました。 ここ を回復しようとしました。