私はいくつかの理由で私のコードでC#とJava enumsを使うのが本当に好きになりました:
ただし、Androidフレームワークには、さまざまなタイプのフラグを渡す必要がある多くのケースがありますが、いずれも列挙型を使用していないようです。 Toast.LENGTH_SHORT
/Toast.LENGTH_LONG
およびView.GONE
、View.VISIBLE
など.
どうしてこれなの?列挙型はDalvikの単純な整数値よりもパフォーマンスが悪いですか?私が知らない他の欠点はありますか?
この回答は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のみが必要な場合は列挙型を避ける
整数は小さく、オーバーヘッドが少なくて済みます。これは、モバイルデバイスでは依然として重要です。
私の同僚は、この状況に関して小さなテストを行いました。同量の「enum」を持つclass
とenum
を自動生成しました。彼は30000エントリを生成したと思います。
結果は次のとおりです。
.class
のclass
は約1200KBでした.class
のenum
は約800KBでしたこれが誰かを助けることを願っています。