72

次の例があります。

import java.util.EnumSet;
import java.util.Iterator;

public class SizeSet {

    public static void main(String[] args) {
        EnumSet largeSize = EnumSet.of(Size.XL,Size.XXL,Size.XXXL);
        for(Iterator it = largeSize.iterator();it.hasNext();){
            Size size = (Size)it.next();
            System.out.println(size);
        }
    }
}


enum Size {
  S, M, L, XL, XXL, XXXL;

}

このコードでは、Enum が Enum 型の Sizes を作成することを理解できます。

私の質問は: largeSizeEnumSet 型のオブジェクトですか? それは本当にどういう意味ですか?私は本当にそれをもっとよく理解したいです。

4

10 に答える 10

48

変数に関しては、その型はその宣言で見つかります。

EnumSet largeSize

そうです、largeSize(コレクションなので名前を付ける必要がありますlargeSizes)は typeEnumSetです。また、一般化する必要があるため、次のように宣言する必要があります。

EnumSet<Size> largeSizes

つまり、それlargeSizesはタイプEnumSetです。EnumSetは、特定の列挙型の列挙型インスタンスを含む です。他の実装 ( 、など)Setよりも効率的です。が何であるかを知るには、そのAPIを読んでください。SetHashSetTreeSetEnumSet

于 2012-08-06T08:59:11.680 に答える
44

シンプルは、一度に1 つEnumだけ選択できる値のリストです。あなたの例を使用すると、特定の布のサイズは S、M、L などのいずれかになります。の代わりに単純な定数を使用することもできますが、これには読みやすさ、メンテナンスの容易さ、および厳密な型チェックという利点があります。Enum

Anは、変数が同時にEnumSet複数の値を想定する必要がある場合に使用されます。Enumたとえば、画面に書き込むフォントは、同時に太字斜体の両方にすることができます。を使用するEnumSetと、さまざまな値を追加して、それらのいずれかが実際に設定されているかどうかをいつでもテストできます。他のプログラミング言語から Java にたどり着いた場合、これは通常flagsと呼ばれる機能です。

2 つを比較します。

enum Size { S, M, L, XL, XXL, XXXL }
Size currentSize;
...
currentSize = Size.S;
...
if (currentSize == Size.S) ...

単一の値を定義、割り当て、チェックしEnumます。

enum FontStyle { Bold, Italic, Underline, Strikethrough }
EnumSet<FontStyle> currentStyle;
...
currentStyle = EnumSet.of(FontStyle.Bold, FontStyle.Italic);
...
if (currentStyle.contains(FontStyle.Italic)) ...

Enumを定義し、同時に2 つの値を代入し、そのうちの 1 つが実際に設定されているかどうかを確認します。

于 2016-01-03T12:57:16.560 に答える
40

コードを簡素化する

EnumSet<Size> largeSize = EnumSet.of(Size.XXXL, Size.XXL, Size.XL, Size.L);
for(Size size: largeSize)
    System.out.print(size+" ");

列挙型を格納するように設計されていることを除いて、largeSize は通常の Set であることがわかります。それはどう違うのですか?まず、JVM はセットのすべての可能な値を認識します。つまり、すべてのオブジェクトを格納する代わりに、ビットマップを使用できます。1 はアイテムが存在することを意味し、0 はアイテムが存在しないことを意味します。これは、セットの順序が序数値の順序、つまり定義された順序であることも意味します。これが、これが印刷される理由です

L XL XXL XXXL

詳細を知りたい場合は、このクラスのソースを読むことをお勧めします。

于 2012-08-06T09:22:13.200 に答える
5

オラクルのドキュメントによると

列挙型セットは、内部的にビット ベクトルとして表されます。この表現は非常にコンパクトで効率的です。

読みやすく、タイプ セーフで、メモリ フットプリントが小さい...これ以上何が必要ですか?

于 2015-02-04T18:58:02.047 に答える
3

次の例を考えます。

....
public static final String S = "s";
public static final String M = "m";
public static final String L = "l";
....

Set<String> sizeSet = new HashSet<String>();
sizeSet.add(S);
sizeSet.add(M);

では、上記の例のsizeSetとは何ですか?

EnumSetは上記の例と何ら変わりはありませんが、EnumSetが列挙型で動作および最適化される特別なSet実装であるという点だけが、それだけです。

于 2012-08-06T09:15:24.133 に答える
3
EnumSet largeSize

EnumSet largeSize は、XL、XXL、および XXXL を含む Enum 値のセットです。

Size 

Size は定数値 S、M、L、XL、XXL、XXXL を持つ Enum 型のクラスです。

largeSize.iterator()

EnumSet の Iterator は自然順序であり、enum の値が最初に宣言された順序です。

  • EnumSet クラスは Java Collections Framework のメンバーであり、同期されません。
  • これは高性能なセットの実装であり、HashSet よりもはるかに高速です。
  • 各 EnumSet インスタンスのすべての要素は、単一の列挙型の要素である必要があります。

詳細については、API ドキュメントを参照してください: http://docs.oracle.com/javase/8/docs/api/java/util/EnumSet.html

于 2016-08-10T13:12:02.233 に答える