次のコードを使用して、EnumSet の同期インスタンスを初期化します。
private final Set<MyClass> instance = Collections.synchronizedSet(EnumSet.noneOf(MyClass.class));
2 つの質問があります。
- この場合、コンパクトさと効率性などの EnumSet のすべての利点を保持できますか?
- EnumSetの空で同期されたインスタンスを取得するための意味的に豊富な方法はありますか?
次のコードを使用して、EnumSet の同期インスタンスを初期化します。
private final Set<MyClass> instance = Collections.synchronizedSet(EnumSet.noneOf(MyClass.class));
2 つの質問があります。
まあjavadocから:
複数のスレッドが列挙型セットに同時にアクセスし、少なくとも 1 つのスレッドがセットを変更する場合は、外部で同期する必要があります。これは通常、列挙型セットを自然にカプセル化するオブジェクトを同期することによって実現されます。そのようなオブジェクトが存在しない場合は、Collections.synchronizedSet(java.util.Set) メソッドを使用してセットを「ラップ」する必要があります。これは、偶発的な非同期アクセスを防ぐために、作成時に行うのが最適です。
Set s = Collections.synchronizedSet(EnumSet.noneOf(MyEnum.class));
だから私はそれがあなたができる最善だと思います。
私もSet
final
あなたがしたように保ちます。彼らがjavadocで言及していないのは奇妙です。
編集:最初の質問に答えるには、短い答えはい、長い答え、はいですが、それに加えて同期の代価を支払う必要があります。