Player タイプ ARCHER
、WARRIOR
、およびがあるシナリオがありsorcerer
ます。
プレーヤー タイプの Player クラスで何を使用すればよいですか?
定数最終静的文字列変数またはEnum ? なぜ?
理由を教えてください。
5 に答える
定数文字列 (または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 を検討している場合に特に役立ちます。
列挙型定数、またはすべての項目に共通の追加機能が本当に必要な場合にのみ、列挙型を使用することをお勧めします。
これはもちろん、作成しているアプリケーションの種類と、サポートするバージョンとデバイスによって異なります。
その理由は、列挙型はアイテムのインスタンスを割り当てるため、オーバーヘッドが追加されるためです。Androidプラットフォームには最小限の列挙型があり、ほとんどすべての定数が最終的な静的int(View.GONEなど)であることに気付くでしょう。