zoukankan      html  css  js  c++  java
  • Effective Java 32 Use EnumSet instead of bit fields

    Bit fields is used for passing around sets of constants. Such as

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

    }

       

    text.applyStyles(STYLE_BOLD | STYLE_ITALIC);

       

    Disadvantage of Bit field

    1. Harder to interpret a bit field than a simple int enum constant when it's printed as a number.
    2. Hard to iterate over all of the elements represented by a bit field.

         

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

    }

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

       

    Advantage of EnumSet

    1. Richness, type safety and interoperability of Set implementation.
    2. Bulk operations, such as removeAll and retainAll, are implemented using bit-wise arithmetic, just as you'd do manually for bit fields.

       

    Disadvantage of EnumSet

    It's not immutable before release 1.6.

       

    Note

    If the underlying enum type has sixty-four or fewer elements—and most do—the entire EnumSet is represented with a single long, so its performance is comparable to that of a bit field.

       

    Summary

    Because an enumerated type will be used in sets, there is no reason to represent it with bit fields. The EnumSet class combines the conciseness and performance of bit fields with all the many advantages of enum types described in Item 30. You can wrap an EnumSet with Collections.unmodifiable Set, but conciseness and performance will suffer.

       

       

  • 相关阅读:
    编写OracleMembershipProvider,让SharePoint2007使用Oralce中的用户数据实现Form验证。 (第三天)
    学习《Building Applications with FME Objects》 之一 关于FME Objects
    我们在这里期待~~
    用python写fme数据转换脚本
    学习《Building Applications with FME Objects》 之七 坐标系统
    菜鸟笔记Linq初学 top(2)
    菜鸟笔记Linq初学 top(1)
    Sqlserver2008R2搭建本地服务器
    Python3之列表、元组和购物车程序练习
    Python3之字符串
  • 原文地址:https://www.cnblogs.com/haokaibo/p/use-EnumSet-instead-of-bit-fields.html
Copyright © 2011-2022 走看看