1. ホーム
  2. android

なぜAndroidはもっとenumを使わないのですか?

2023-09-20 11:46:48

質問

私はいくつかの理由から、自分のコードでC#とJavaの列挙型を使うのが本当に好きになり始めました。

  • 整数、文字列、またはブール値フラグのセットよりもはるかに型安全です。
  • より読みやすいコードになります。
  • intや文字列よりもenumの方が不正な値を設定することが難しい。
  • 変数やパラメータに許される値を容易に発見することができます。
  • 私が読んだすべてのものは、C# とほとんどの JVM において、それらが整数と同じようにうまく機能することを示しています。

しかし、Android フレームワークには、さまざまなタイプのフラグを渡す必要がある多数のケースがありますが、どれも列挙型を使用していないようです。 その使用が有益であると思われる例をいくつか挙げます。 Toast.LENGTH_SHORT / Toast.LENGTH_LONG そして View.GONE , View.VISIBLE など。

これはなぜでしょうか? enum は Dalvik の単純な整数値よりもパフォーマンスが悪いのでしょうか? 私が認識していない他の欠点があるのでしょうか?

どのように解決するのですか?

この回答は2011年3月現在では無効になっています。

EnumsはFroyo以降で使用できます - この回答によると( Android のパフォーマンスのヒントから「Ints しか必要ないところでは、Enum を避ける」が削除されたのはなぜですか? ) によると、Android VM チームのメンバーからの回答 (および 彼のブログ ).


前回の回答

Androidチームの公式な推奨は、避けられるときはいつでも列挙を避けることです。

列挙型は非常に便利ですが サイズや速度が重要な場合には、残念ながら と速度が問題になります。例えば、このように

public enum Shrubbery { GROUND, CRAWLING, HANGING }

は740バイトを と比較して、.dex ファイルに 3つの public static final ints を持つ同等のクラスと比較して、.dex ファイルに 40 バイトが追加されます。最初の使用時に クラスのイニシャライザは メソッドを呼び出します。 の列挙された値を表すオブジェクトに対してメソッドを呼び出します。各オブジェクト はそれ自身の静的フィールドを取得し フルセットが配列に格納されます ("$VALUES" と呼ばれる静的フィールド)。 という静的フィールド)に格納されます。これは という静的フィールドに格納されます。 のためだけです。さらに、これ。

Shrubbery shrub = Shrubbery.GROUND;

は静的フィールドの検索を行います。もし GROUND"が静的なfinal intであったなら コンパイラはそれを既知の定数として扱い 定数として扱い、それをインライン化します。

ソースは 整数値しか必要としない列挙型を避ける