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) { ... }
}
enumset
Der 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