web-dev-qa-db-ja.com

静的文字列定数VS列挙型Java 5+

私はその質問と回答を読みました: Javaで定数を実装するための最良の方法は何ですか?

そして、列挙型が定数のセットを実装するためのより良い方法であるという決定を思いつきました。また、SunのWebサイトで、動作を列挙型に追加する方法の例を読みました(前述の投稿のリンクを参照してください)。したがって、Stringキーを持つコンストラクターを列挙型に追加して、一連のString値を保持することに問題はありません。

ここでの唯一の問題は、文字列値にアクセスするために「.nameOfProperty」を追加する必要があることです。したがって、コードのどこでも、名前(EnumName.MY_CONSTANT)だけでなく、そのような(Enum.MY_CONSTANT.propertyName)定数値にアドレス指定する必要があります。

私はここにいますか?どう思いますか?

24
EugeneP

はい、命名は少し長く見えるかもしれません。しかし、想像できるほどではありません...

  1. 列挙型クラスはすでにいくつかのコンテキストを提供しているため( "これが属する定数のセットは何ですか?")、インスタンス名は通常、定数名よりも短い(強い型付けはすでに他の列挙型の同様の名前付きインスタンスと区別されています)。

  2. また、静的インポートを使用で長さをさらに短くすることもできます。混乱を避けるために、どこでも使用するべきではありませんが、列挙型に強くリンクされているコードで問題ないと思います。

  3. 列挙型のswitchesでは、クラス名を使用しません。 (Java 7より前の文字列では切り替えもできません。)

  4. 列挙型クラス自体で、短い名前を使用します。

  5. 列挙型にはメソッドがあるため、定数を多用する多くの低レベルコードは、ビジネスコードから列挙型クラス自体(動的メソッドまたは静的メソッド)に移行できます。ご覧のとおり、コードを列挙型に移行は、長い名前の使用をさらに削減します。

  6. 定数は、多くの場合、6つの定数の1つまたは他の4つの定数との同等性をテストするifなどのグループで扱われます。列挙型にはEnumSetsメソッドを備えたcontainsが装備されています(または同様に適切なグループを返す動的メソッド)、これによりグループをグループとして扱う(副次的な利点として、グループ化のこれら2つの実装は非常に高速であることに注意してください--O(1)-そしてメモリ不足です!)。

これらすべての点で、実際のコードははるかに短いことがわかりました

25
KLE

定数に関する質問に関しては、列挙型はすべて同じタイプの定数を表す必要があります。任意の定数を実行している場合、他の質問ですべて説明されている理由により、これは間違った方法です。

必要なのが文字列定数だけである場合、詳細なコードに関しては正しいです。ただし、toString()メソッドをオーバーライドして、プロパティの名前を返すことはできます。文字列を他の文字列に連結するだけの場合は、コードの冗長性をさらに節約できます。

ただし、プロパティファイルやその他の国際化手段の使用を検討しましたか?多くの場合、文字列の詳細を定義するときはユーザーインターフェイスメッセージ用であり、これらを別のファイルに抽出すると、将来の作業を大幅に節約でき、翻訳がはるかに簡単になります。

7
Nick Fortescue