web-dev-qa-db-ja.com

なぜAndroidより多くの列挙型を使用しないのですか?

私はいくつかの理由で私のコードでC#とJava enumsを使うのが本当に好きになりました:

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

ただし、Androidフレームワークには、さまざまなタイプのフラグを渡す必要がある多くのケースがありますが、いずれも列挙型を使用していないようです。 Toast.LENGTH_SHORT/Toast.LENGTH_LONGおよびView.GONEView.VISIBLEなど.

どうしてこれなの?列挙型はDalvikの単純な整数値よりもパフォーマンスが悪いですか?私が知らない他の欠点はありますか?

78
jnylen

この回答は2011年3月時点で古くなっています。

Froyo以上で列挙型を使用できます-この回答によれば( なぜAndroidのパフォーマンスのヒントから「Intだけが必要な列挙型を避ける」が削除されたのですか? ) AndroidVMチーム(および his blog )。


前の回答:

公式のAndroidチームの推奨事項は、できる限り列挙型を避けることです。

列挙型は非常に便利ですが、残念ながらサイズと速度が問題になる場合は苦痛になります。たとえば、これ:

public enum Shrubbery { GROUND, CRAWLING, HANGING }

3つのpublic static final intを持つ同等のクラスと比較して、.dexファイルに740バイトを追加します。初めて使用するとき、クラス初期化子は列挙値のそれぞれを表すオブジェクトのメソッドを呼び出します。各オブジェクトは独自の静的フィールドを取得し、完全なセットは配列(「$ VALUES」と呼ばれる静的フィールド)に格納されます。これは、3つの整数だけの大量のコードとデータです。さらに、これ:

Shrubbery shrub = Shrubbery.GROUND;

静的フィールド検索を行います。 「GROUND」が静的な最終intである場合、コンパイラはそれを既知の定数として扱い、インライン化します。

ソース: Intsのみが必要な場合は列挙型を避ける

整数は小さく、オーバーヘッドが少なくて済みます。これは、モバイルデバイスでは依然として重要です。

14
Russell Steen

私の同僚は、この状況に関して小さなテストを行いました。同量の「enum」を持つclassenumを自動生成しました。彼は30000エントリを生成したと思います。

結果は次のとおりです。

  • .classclassは約1200KBでした
  • .classenumは約800KBでした

これが誰かを助けることを願っています。

5
prolink007