8

同僚と私は、Javaが列挙をどのように表すかについて話し合いました。私は彼らが厳密にC/C++のようなintであるという印象を受けました。または、ビヘイビアー(Type-Safe列挙型)を追加すると、クラスにラップされます。彼は、それが十分に小さければ、Javaはそれを1バイトに圧縮すると信じていました。

しかし、私はこれをOracleサイトで見つけました。

Javaプログラミング言語の列挙型は、他の言語の列挙型よりもはるかに強力です。他の言語の列挙型は、栄光の整数にすぎません。新しい列挙型宣言は、本格的なクラス(列挙型と呼ばれる)を定義します。

実物だと思います。もしそうなら、スペースを節約するためにそれらを最適化する方法はありますか?

ありがとう

編集:Jonの回答へのコメントで述べたように、私は列挙型のシリアル化サイズを求めています。

4

1 に答える 1

18

いいえ、Java列挙値は実際にはオブジェクトです。それらは、フィールド、メソッドなど、および値ごとにメソッドのさまざまな実装を持つことができます。ただし、それらの固定セットのみがあります。列挙型のインスタンスを自分で作成するのとは異なります。有効な値のセットは、型の初期化時に作成されます。膨大な数の列挙値がない限り、最適化について考える必要はほとんどありません。

列挙値のセットを論理的に検討するときはいつでも、簡単に達成できる最適化の1つのビットを使用することに注意してください。EnumSetこれは、基本的にセットを効率的に表すためにビットパターンを使用します。

(ここでは、C#はJavaよりもC ++に近いことに注意してください。C#列挙型は残念ながらオブジェクト指向ではありません。ため息をつきます。)

編集:列挙値は、ドキュメントに従って名前でシリアル化されます:

バージョン5.0の新機能である列挙型を処理するためのサポートがシリアル化に追加されました。enumインスタンスをシリアル化するためのルールは、「通常の」シリアル化可能なオブジェクトをシリアル化するためのルールとは異なります。enumインスタンスのシリアル化された形式は、そのenum定数名と、その基本enumタイプを識別する情報のみで構成されます。デシリアライズの動作も異なります。クラス情報を使用して適切な列挙型クラスが検索され、返される列挙型定数を取得するために、そのクラスと受信した定数名を使用してEnum.valueOfメソッドが呼び出されます。

ただし、実際に小さなシリアル化されたフォームを使用している場合は、Javaの組み込みのシリアル化を回避する必要があります。これは、比較的冗長です(また、バージョン管理の問題に非常に敏感です)。あらゆる種類の選択肢があります。私が最もよく知っているのはProtocolBuffersです。これ、列挙値を単なる整数としてシリアル化します。

于 2011-09-01T21:32:50.493 に答える