プレイヤータイプARCHER
、WARRIOR
、およびsorcerer
を使用するシナリオがあります。
プレーヤークラスのプレーヤークラスで使用すべきものは何ですか?
定数最終静的文字列変数またはEnum?なぜ?
理由を教えてください。
定数文字列(またはint
値-同じです)を使用するとします:
// Constants for player types
public static final String ARCHER = "Archer";
public static final String WARRIOR = "Warrior";
// Constants for genders
public static final String MALE = "Male";
public static final String FEMALE = "Female";
その後、データのタイプを実際に知らないことになり、潜在的に不正なコードにつながります。
String playerType = Constants.MALE;
列挙型を使用すると、次のようになります。
// Compile-time error - incompatible types!
PlayerType playerType = Gender.MALE;
同様に、列挙型は制限された値のセットを提供します。
String playerType = "Fred"; // Hang on, that's not one we know about...
対
PlayerType playerType = "Fred"; // Nope, that doesn't work. Bang!
さらに、Javaの列挙型はそれらに関連するより多くの情報を持つことができ、また振る舞うこともできます。
列挙型を使用すると、必要な入力セットに制限されますが、定数文字列を使用しても、ロジックの一部ではない他の文字列を使用できます。
これにより、データを入力している間、間違えずにドメインから何かを入力することができ、プログラムの可読性も向上します。
さらに、必要に応じて、常に列挙型を文字列として使用できます。 参照 です。
間違った値を提供させないことに加えて、小さなように見えるかもしれない列挙型の別の機能がありますが、私の意見では非常に重要です。最新のIDEは列挙型の値を自動的に提案できますが、文字列定数の可能な値を確実に推測する方法はありません(Intellij IDEAは後者を行いますが、JDKクラスおよび一般的なライブラリのみ)。これは、新しいAPIを検討している場合に特に役立ちます。
型の安全性のために列挙型を使用することをお勧めします。間違った値は入力できません。しかし、enum in Androidは非常に多くのメモリを必要とします。代わりにintdefを使用する必要があります。例と説明については、この回答を参照してください。
IntDef/StringDefの例
また、可能な限りAndroidソースコードが列挙型をIntDef/StringDefに置き換えているソースコードを確認できます。例:View.VISIBLE。
列挙型定数、またはすべてのアイテムに共通の追加機能が本当に必要な場合にのみ、列挙型を使用することをお勧めします。
もちろん、作成するアプリケーションの種類と、サポートするバージョンとデバイスによって異なります。
その理由は、列挙型はアイテムのインスタンスを割り当てるためオーバーヘッドが増えるためです。 Androidプラットフォームには最小の列挙があり、ほとんどすべての定数は最終的な静的int(View.GONEなど))であることに気付くことができます。