3

Guava からの使用に関する良い例をここで読みました。ImmutableSet完全を期すために、例をここに報告します。

public static final ImmutableSet<String> COLOR_NAMES = ImmutableSet.of(
  "red",
  "orange",
  "yellow",
  "green",
  "blue",
  "purple");

class Foo {
  Set<Bar> bars;
  Foo(Set<Bar> bars) {
    this.bars = ImmutableSet.copyOf(bars); // defensive copy!
  }
}

問題は、Java 列挙型を使用して同じ結果を得ることができるかということです。

PS:この質問は私の心に混乱をもたらしました!

4

3 に答える 3

2

いいえ、そうではありません。比較

public enum Color {
    RED, ORANGE, YELLOW, GREEN, BLUE, PURPLE;
}

Set<Color> colors = EnumSet.allOf(Color.class);

Set<String> colors = ImmutableSet.of(
  "red", "orange", "yellow", "green", "blue", "purple"
);

Java は静的に型付けされるためSet<Color>、最初の例には aSet<String>があり、後者の例には a があります。

編集 1

もう 1 つの違いはImmutableSet、実行時に任意のサイズを作成できることです (単一の要素equals()が他の要素ではない場合)。対照的に、EnumSetは実行時に作成することもできますが、列挙値の数より多くの要素を含めることはできません。

編集 2

ImmutableSet同じインターフェースを実装している限り、 には異なるクラスの要素を含めることができます。anEnumSetには列挙型のみを含めることができます。

于 2013-04-11T15:20:34.740 に答える
0

これらすべての派手なユーティリティ ライブラリを依存関係として持っていない場合は、標準的な方法を使用できます。

enum Furniture{SOFA, CHAIR, TABLE};
Set<Furniture> set = Collections.unmodifiableSet(new HashSet<>(Arrays.asList(Furniture.values())));

ところで:それは最も効率的な方法ではありませんか?これらのライブラリのメソッド内に多くのコードを見ましたが、おそらくやり過ぎでしょうか? とにかく、それは文脈に依存します。私のアプローチは少し冗長で、キャッシュなどの最適化は行いませんが、独立しており、まさに OP が求めているものです。

于 2017-10-20T11:51:34.537 に答える