2015-08-20 13 views
11

Il EnumSet<E> classe è definita come:Come funziona java.util.EnumSet <E>?

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

in JCF. Inoltre, la maggior parte dei metodi utilizzati dalla classe stessa sono statici. Infine, la classe non sembra implementare i metodi add(), iterator(), remove(), size(), o isEmpty() e li eredita semplicemente da AbstractSet che non li implementa. Ho due domande:

  1. Come esattamente EnumSet oggetti sono istanziati e utilizzati?
  2. Perché è possibile utilizzare il metodo add() per gli oggetti EnumSet?

risposta

16

La maggior parte dei metodi statici che vedete sono fabbrica metodi (of(), complementOf(), allOf(), etc.).

Questi metodi restituiscono un'istanza di EnumSet. Il tipo effettivo di EnumSet creato e restituito da questi metodi è una sottoclasse di EnumSet (RegularEnumSet,), che non fa parte dell'API pubblica, ma implementa tutti i metodi richiesti. Tutto quello che devi sapere è che implementano EnumSet.

8

EnumSet è una classe astratta in sé, quindi non deve implementare alcun metodo astratto che erediti. Passa tale responsabilità alle sue sottoclassi non astratte.

È possibile chiamare i metodi non implementati perché in realtà li si sta chiamando su un'istanza di una sottoclasse di EnumSet. (Come EnumSet è astratta, non può essere in sé un'istanza direttamente.)

+0

si dovrebbe includere che l'EnumSet implementa le interfacce che implementa AbstractSet. Ciò assicura che add(), iterator(), remove(), ... è nel contratto per 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()); 
    } 
} 

Questo stampa:

[] 
[A] 
class java.util.RegularEnumSet 

Per quanto riguarda l'attuazione, this Link fornisce una descrizione:

EnumSet è una classe astratta e fornisce due concreti implementazioni, java.util.RegularEnumSet e java.util.JumboEnumSet. La differenza principale tra RegularEnumSet e JumboEnumSet è che l'ex utilizza una variabile long per archiviare elementi mentre in seguito utilizza un elemento long[] a memorizzandone l'elemento. Dal momento che RegularEnumSet utilizza la variabile long, che è un tipo di dati a 64 bit , può contenere solo una parte dell'elemento. Ecco perché quando un vuoto EnumSet viene creato utilizzando EnumSet.noneOf() metodo, scegliere RegularEnumSet se nell'universo chiave (numero di istanze enum a Key Enum) è inferiore o uguale a 64 e JumboEnumSet se universo chiave è più di 64.

Ciò significa che EnumSet sceglierà l'implementazione corretta per te.

1
  1. Esattamente come oggetti EnumSet sono istanziati e utilizzati?

L'EnumSet è una "classe astratta" ed è preferito rispetto HashSet quando si dispone di un certo numero di "chiavi" che è noto in anticipo. Ad esempio quando hai una chiave di configurazione.

Il prestazioni sono meglio di HashSet perché "... dal momento che le costanti Enum sono unici e ha una lunghezza pre-definita, in quanto non è possibile definire una nuova costante enum in fase di esecuzione, permette API Java progettista di altamente ottimizzare EnumSet ... "(per saperne di più: http://javarevisited.blogspot.com/2014/03/how-to-use-enumset-in-java-with-example.html#ixzz3jNcyB8ve)

È possibile creare un'istanza con un sacco di metodo factory, per esempio EnumSet.of (...)

  1. Perché è possibile utilizzare il metodo add() per oggetti EnumSet?

Dopo aver creato un "EnumSet" oggetto è possibile aggiungere a run-time un altro elemento con la "add" metodo. Se si dispone ad esempio di un elenco di chiavi di configurazione, è possibile rappresentare EnumSet con i tasti "selezionati" e aggiungerli in fase di runtime.

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); 
    } 

} 

L'output è:

[KEY1, KEY2] 
[KEY1, KEY2, KEY3] 
Problemi correlati