1

型を使用するenumと、各定数に引数を追加し、各定数に本体を提供し、型に本体を提供できます。ただし、それを行わない場合:

enum enumType { C1, C2, C3 };

enum整数定数を宣言するのと同じくらい効率的に型を使用できますか?

static final int C1 = 1;
static final int C2 = 2;
static final int C3 = 3;  // or whatever

それとも、この機能は使用されていませんが、この機能 (ボディを提供する機能) によるオーバーヘッドがまだありますか?

4

4 に答える 4

7

パフォーマンスを比較するコンテキストの種類を指定していません。ほとんどの場合、enum参照値のみが比較されるため、メンバーがオブジェクトであるという事実はまったく関係ありません。オブジェクト自体には触れていません。

ただしpublic static final intコンパイル時の定数であり、それらの値は使用場所でハードコーディングされているため、明らかにオーバーヘッドはまったく発生しません。

したがって、オーバーヘッドがまったくないのに対してオーバーヘッドはほとんどありませんが、コンパイル時の定数の問題が犠牲になり、それらのいずれかを変更すると、それを参照するすべてのものを再コンパイルする必要があります。

于 2013-08-05T19:27:56.220 に答える
2

はい、s を使用すると非常に効率的enumです。を使用して、列挙型の 2 つのインスタンスを比較することもできます。これには==、タイプ セーフの追加の利点があります。

Fruits.APPLES == Fruits.ORANGES

Enumクラス内を見ると、equals()メソッドが==2 つのインスタンスを比較するために使用されていることがわかります。また、列挙型インスタンスを作成するという面倒な作業はすべてクラスのコンパイル時に行われるため、追加のオーバーヘッドはありません。

于 2013-08-05T19:27:53.637 に答える
1

static final int列挙型定数は、定数を使用して関連する機能を実現する場合と比較して、パフォーマンスが大幅に低下することはありません。内部的には、列挙定数は単純に 32 ビット整数として表されます。ただし、JVM のコンテキストでは、enum 定数は型の安全性、拡張性、および int 定数で達成できるよりもはるかに高い柔軟性を提供します。

int 定数よりも enum 定数を使用することの唯一の欠点は、enum クラス オブジェクトをロードして初期化する時間です。質問で示した例では、アプリケーションがロードされて実行されると、int 定数よりも列挙型を使用してもパフォーマンスが低下することはありません。enum 定数は必然的にシングルトン (JVM によって保証される) であるため、ほとんどのプリミティブ値と同じように、同等性と同一性の両方について「==」演算子を使用して効率的に比較できることにも注意してください。

Joshua Bloch は、Effective Java 第 2 版で列挙型に関する優れた議論を提供しています。そして、コンパイル時に既知である固定された (またはほとんど固定された) 定数のセットを表現するために enum 定数を常に使用する必要がある理由について、説得力のある議論を行います。

于 2013-08-05T20:35:51.693 に答える
0

それは、それらが使用されているコンテキストにのみ依存します。関連する定数がある場合は列挙型を使用し、そうでない場合は定数を使用する必要があります。無関係な定数を一緒にクラブするのは非論理的で間違った方法です。

どちらもインライン定数です。つまり、両方の出現ごとに対応する値に置き換えられるため、それらに変更を加えるたびに、コードでそれらを使用するすべてのファイルを再度コンパイルする必要があります。そうしないと、誤った結果が得られます。

関連する定数がある場合は、列挙型を使用するのが賢明な選択です。として、

  1. それらはシリアル化されています。
  2. API サポートが提供されているため、オーバーヘッドをあまりかけずに効率的に使用できます。
于 2013-08-05T20:08:08.320 に答える