[JAVA] Punkt 36: Verwenden Sie EnumSet anstelle von Bitfeldern

36. Verwenden Sie EnumSet anstelle des Bitfelds

Wenn ein Element vom Typ enum auf eine Menge angewendet wurde, wurde früher das int enum-Muster (Item34) verwendet, um jeder Konstanten die Potenz von 2 zuzuweisen.

// Bit field enumeration constants - OBSOLETE!
public class Text {
    public static final int STYLE_BOLD          = 1 << 0;  // 1
    public static final int STYLE_ITALIC        = 1 << 1;  // 2
    public static final int STYLE_UNDERLINE     = 1 << 2;  // 4
    public static final int STYLE_STRIKETHROUGH = 1 << 3;  // 8
 // Parameter is bitwise OR of zero or more STYLE_ constants
    public void applyStyles(int styles) { ... }
}

Durch Anwenden einer ODER-Verknüpfung auf diese wurden einige Elemente zu einem Satz zusammengefasst. (Bitfeld)

text.applyStyles(STYLE_BOLD | STYLE_ITALIC);

Das Verbinden und Überschneiden kann auch durch Bitoperation realisiert werden, aber diese Methode erbt alle schlechten Punkte von int enum.

Sie sollten die EnumSet-Klasse verwenden, um eine Reihe von Konstanten zu erstellen. Die Leistung ist vergleichbar mit der Verarbeitung im Bitfeld. Das obige Beispiel verwendet unten enum und EnumSet.

// EnumSet - a modern replacement for bit fields
public class Text {
    public enum Style { BOLD, ITALIC, UNDERLINE, STRIKETHROUGH }
 // Any Set could be passed in, but EnumSet is clearly best
    public void applyStyles(Set<Style> styles) { ... }
}

enumsetDer clientseitige Code, der die Instanz übergibt, lautet wie folgt.

text.applyStyles(EnumSet.of(Style.BOLD, Style.ITALIC));

Die obige Methode `applyStyles``` verwendet` Set als Argument anstelle von `` `EnumSet. Die meisten Benutzer übergeben "EnumSet", tun dies jedoch nach dem Prinzip, dass sie die Schnittstelle (Item64) akzeptieren sollten, anstatt die Implementierungsklasse als Argument zu akzeptieren.

Recommended Posts

Punkt 36: Verwenden Sie EnumSet anstelle von Bitfeldern
Punkt 37: Verwenden Sie EnumMap anstelle der ordinalen Indizierung
Verwenden Sie enum anstelle der int-Konstante
Punkt 71: Vermeiden Sie die unnötige Verwendung geprüfter Ausnahmen
Punkt 72: Bevorzugen Sie die Verwendung von Standardausnahmen
[Java] Warum StringUtils.isEmpty () anstelle von String.isEmpty () verwenden?
[Java] benutze Optional anstelle von if (hoge! = Null) {...}
Punkt 44: Bevorzugen Sie die Verwendung von Standardfunktionsschnittstellen
Punkt 90: Betrachten Sie Serialisierungs-Proxys anstelle von serialisierten Instanzen
Verwendung der Datumsklasse
Punkt 52: Verwenden Sie Überladung mit Bedacht
Punkt 53: Verwenden Sie Varargs mit Bedacht
Punkt 45: Verwenden Sie Streams mit Bedacht