2015-08-20 15 views
11

EnumSet<E> klasy określa się jako:Jak działa java.util.EnumSet <E>?

public abstract class EnumSet<E extends Enum<E>> 
extends AbstractSet<E> 
implements Cloneable, Serializable 

w FKŻ. Ponadto większość metod implementowanych przez samą klasę jest statyczna. Wreszcie, klasa nie wydaje się implementować metod i po prostu dziedziczy je z AbstractSet, który ich nie implementuje. Mam dwa pytania:

  1. Jak dokładnie EnumSet obiekty są tworzone wystąpienia i używane?
  2. Dlaczego mogę korzystać z metody add() dla obiektów EnumSet?

Odpowiedz

16

Większość statycznych metod widać są fabryka metody (of(), complementOf(), allOf(), etc.).

Te metody zwracają instancję EnumSet. Rzeczywisty typ zestawu EnumSet utworzonego i zwróconego przez te metody jest podklasą EnumSet (RegularEnumSet, JumboEnumSet), które nie są częścią publicznego interfejsu API, ale implementują wszystkie wymagane metody. Wszystko, co musisz wiedzieć, to implementacja EnumSet.

8

EnumSet jest klasą abstrakcyjną, więc nie musi implementować żadnych abstrakcyjnych metod, które dziedziczy. Przekazuje tę odpowiedzialność na jej nie abstrakcyjne podklasy.

Możesz wywoływać niezimplementowane metody, ponieważ faktycznie wywołujesz je w instancji podklasy EnumSet. (Jak EnumSet jest abstrakcyjny, nie można bezpośrednio instancja sam.)

+0

powinien zawierać że EnumSet implementuje interfejsy AbstractSet narzędzi. Zapewnia to, że add(), iterator(), remove(), ... jest w umowie dla EnumSet. – Taemyr

4
import java.util.*; 
enum Foo { 
    A, B 
} 
class a { 
    public static void main(String[] args) { 
    System.out.println(EnumSet.noneOf(Foo.class)); 
    System.out.println(EnumSet.of(Foo.A)); 
    System.out.println(EnumSet.of(Foo.A).getClass()); 
    } 
} 

Drukuje:

[] 
[A] 
class java.util.RegularEnumSet 

Jeśli chodzi o wykonanie, this link zawiera opis:

EnumSet jest klasą abstrakcyjną i zapewnia dwa konkretne implementacje, java.util.RegularEnumSet i java.util.JumboEnumSet. Główna różnica pomiędzy RegularEnumSet i JumboEnumSet jest to, że były wykorzystuje zmienną long do przechowywania elementów, podczas gdy później wykorzystuje long[] do sklep jego element. Ponieważ RegularEnumSet używa zmiennej long, która jest 64-bitowym typem danych , może zawierać tylko tyle elementów. Dlatego gdy pusta EnumSet jest tworzony przy użyciu EnumSet.noneOf() metody to wybrać RegularEnumSet jeśli wszechświat klucz (liczba wystąpień enum Key Enum) jest mniejsza lub równa 64 i JumboEnumSet jeśli klucz wszechświat jest ponad 64.

To oznacza, że ​​EnumSet wybierze dla Ciebie odpowiednią implementację.

1
  1. Jak dokładnie obiekty EnumSet są wystąpienia i stosowane?

EnumSet jest „klasa abstrakcyjna” i jest korzystny niż HashSet gdy masz kilka „klucze”, które jest znane z góry. Na przykład, gdy masz klucze konfiguracyjne.

Występ są lepsze niż HashSet bo "... ponieważ stałe Enum są unikalne i wstępnie określonej długości, ponieważ nie można zdefiniować nową enum stałą w czasie wykonywania, pozwala projektantowi Java API do bardzo optymalizują EnumSet ... "(Czytaj więcej: http://javarevisited.blogspot.com/2014/03/how-to-use-enumset-in-java-with-example.html#ixzz3jNcyB8ve)

można wystąpienia z partii metody fabryki, na przykład EnumSet.of (...)

  1. Dlaczego mogę użyć metody add() dla obiektów EnumSet?

Po utworzeniu „EnumSet” obiekt można dodać w czasie wykonywania kolejny element z „Dodaj” metody. Jeśli masz na przykład listę kluczy konfiguracyjnych, które możesz reprezentować przez EnumSet, wybierz "wybrane" klucze i dodaj je w czasie wykonywania.

package sample.test; 
import java.util.EnumSet; 

public class Foo { 

    public enum SimpleConfigEnum { KEY1, KEY2, KEY3}; 

/** 
* Example of EnumSet with add 
*/ 
public static void main(String[] args) { 

    //Create an enumSet with two elements: KEY1,KEY2 
    EnumSet<SimpleConfigEnum> eSet = EnumSet.of(SimpleConfigEnum.KEY1, SimpleConfigEnum.KEY2); 
    System.out.println(eSet); 

    //... add another element --> KEY3 
    eSet.add(SimpleConfigEnum.KEY3); 
    System.out.println(eSet); 
    } 

} 

Wyjście jest:

[KEY1, KEY2] 
[KEY1, KEY2, KEY3] 
Powiązane problemy