[JAVA] Élément 36: utiliser EnumSet au lieu de champs de bits

36. Utilisez EnumSet au lieu du champ de bits

Lorsque des éléments de type enum sont appliqués à un ensemble, dans l'ancien temps, le modèle int enum (Item34) était utilisé pour distribuer la puissance de 2 à chaque constante.

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

En appliquant une opération OR à ceux-ci, certains éléments ont été rassemblés dans un ensemble. (Champ de bits)

text.applyStyles(STYLE_BOLD | STYLE_ITALIC);

La jonction et le croisement peuvent également être réalisés par opération binaire, mais cette méthode hérite de tous les mauvais points de int enum.

Vous devez utiliser la classe EnumSet pour créer un ensemble de constantes. Les performances sont comparables au traitement dans le domaine des bits. L'exemple ci-dessus utilise enum et EnumSet ci-dessous.

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

enumsetLe code côté client qui transmet l'instance est le suivant.

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

La méthode ci-dessus applyStyles prend `` Set``` comme argument au lieu de `ʻEnumSet. La plupart des utilisateurs passeront EnumSet```, mais cela se fait selon le principe d'accepter une interface (Item64) plutôt que d'accepter une classe d'implémentation comme argument.

Recommended Posts

Élément 36: utiliser EnumSet au lieu de champs de bits
Point 37: Utilisez EnumMap au lieu de l'indexation ordinale
utiliser enum au lieu de la constante int
Point 71: éviter l'utilisation inutile d'exceptions vérifiées
Point 72: Favoriser l'utilisation d'exceptions standard
[Java] Pourquoi utiliser StringUtils.isEmpty () au lieu de String.isEmpty ()
[Java] utilise facultatif au lieu de if (hoge! = Null) {...}
Point 44: Favoriser l'utilisation d'interfaces fonctionnelles standards
Élément 90: considérez les proxies de sérialisation au lieu des instances sérialisées
Utilisation de la classe Date
Item 52: Utiliser la surcharge judicieusement
Point 53: Utilisez judicieusement les varargs
Point 45: Utilisez judicieusement les flux