<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                ## Chapter 6. Enums and Annotations(枚舉和注解) ### Item 36: Use EnumSet instead of bit fields(用 EnumSet 替代位字段) If the elements of an enumerated type are used primarily in sets, it is traditional to use the int enum pattern (Item 34), assigning a different power of 2 to each constant: 如果枚舉類型的元素主要在 Set 中使用,傳統上使用 int 枚舉模式([Item-34](/Chapter-6/Chapter-6-Item-34-Use-enums-instead-of-int-constants.md)),通過不同的 2 平方數為每個常量賦值: ``` // 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) { ... } } ``` This representation lets you use the bitwise OR operation to combine several constants into a set, known as a bit field: 這種表示方式稱為位字段,允許你使用位運算的 OR 操作將幾個常量組合成一個 Set: ``` text.applyStyles(STYLE_BOLD | STYLE_ITALIC); ``` The bit field representation also lets you perform set operations such as union and intersection efficiently using bitwise arithmetic. But bit fields have all the disadvantages of int enum constants and more. It is even harder to interpret a bit field than a simple int enum constant when it is printed as a number. There is no easy way to iterate over all of the elements represented by a bit field. Finally, you have to predict the maximum number of bits you’ll ever need at the time you’re writing the API and choose a type for the bit field (typically int or long) accordingly. Once you’ve picked a type, you can’t exceed its width (32 or 64 bits) without changing the API. 位字段表示方式允許使用位運算高效地執行 Set 操作,如并集和交集。但是位字段具有 int 枚舉常量所有缺點,甚至更多。當位字段被打印為數字時,它比簡單的 int 枚舉常量更難理解。沒有一種簡單的方法可以遍歷由位字段表示的所有元素。最后,你必須預測在編寫 API 時需要的最大位數,并相應地為位字段(通常是 int 或 long)選擇一種類型。一旦選擇了一種類型,在不更改 API 的情況下,不能超過它的寬度(32 或 64 位)。 Some programmers who use enums in preference to int constants still cling to the use of bit fields when they need to pass around sets of constants. There is no reason to do this, because a better alternative exists. The java.util package provides the EnumSet class to efficiently represent sets of values drawn from a single enum type. This class implements the Set interface, providing all of the richness, type safety, and interoperability you get with any other Set implementation. But internally, each EnumSet is represented as a bit vector. 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. Bulk operations, such as removeAll and retainAll, are implemented using bitwise arithmetic, just as you’d do manually for bit fields. But you are insulated from the ugliness and errorproneness of manual bit twiddling: the EnumSet does the hard work for you. 一些使用枚舉而不是 int 常量的程序員在需要傳遞常量集時仍然堅持使用位字段。沒有理由這樣做,因為存在更好的選擇。`java.util` 包提供 EnumSet 類來有效地表示從單個枚舉類型中提取的值集。這個類實現了 Set 接口,提供了所有其他 Set 實現所具有的豐富性、類型安全性和互操作性。但在內部,每個 EnumSet 都表示為一個位向量。如果底層枚舉類型有 64 個或更少的元素(大多數都是),則整個 EnumSet 用一個 long 表示,因此其性能與位字段的性能相當。批量操作(如 removeAll 和 retainAll)是使用逐位算法實現的,就像手動處理位字段一樣。但是,你可以避免因手工修改導致產生不良代碼和潛在錯誤:EnumSet 為你完成了這些繁重的工作。 Here is how the previous example looks when modified to use enums and enum sets instead of bit fields. It is shorter, clearer, and safer: 當之前的示例修改為使用枚舉和 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) { ... } } ``` Here is client code that passes an EnumSet instance to the applyStyles method. The EnumSet class provides a rich set of static factories for easy set creation, one of which is illustrated in this code: 下面是將 EnumSet 實例傳遞給 applyStyles 方法的客戶端代碼。EnumSet 類提供了一組豐富的靜態工廠,可以方便地創建 Set,下面的代碼演示了其中的一個: ``` text.applyStyles(EnumSet.of(Style.BOLD, Style.ITALIC)); ``` Note that the applyStyles method takes a `Set<Style>` rather than an `EnumSet<Style>`. While it seems likely that all clients would pass an EnumSet to the method, it is generally good practice to accept the interface type rather than the implementation type (Item 64). This allows for the possibility of an unusual client to pass in some other Set implementation. 請注意,applyStyles 方法采用 `Set<Style>` 而不是 `EnumSet<Style>`。雖然似乎所有客戶端都可能將 EnumSet 傳遞給該方法,但通常較好的做法是接受接口類型而不是實現類型([Item-64](/Chapter-9/Chapter-9-Item-64-Refer-to-objects-by-their-interfaces.md))。這允許特殊的客戶端傳入其他 Set 實現的可能性。 In summary, **just 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 34. The one real disadvantage of EnumSet is that it is not, as of Java 9, possible to create an immutable EnumSet, but this will likely be remedied in an upcoming release. In the meantime, you can wrap an EnumSet with Collections.unmodifiableSet, but conciseness and performance will suffer. 總之,**因為枚舉類型將在 Set 中使用,沒有理由用位字段表示它。** EnumSet 類結合了位字段的簡潔性和性能,以及 [Item-34](/Chapter-6/Chapter-6-Item-34-Use-enums-instead-of-int-constants.md) 中描述的枚舉類型的許多優點。EnumSet 的一個真正的缺點是,從 Java 9 開始,它不能創建不可變的 EnumSet,在未來發布的版本中可能會糾正這一點。同時,可以用 `Collections.unmodifiableSet` 包裝 EnumSet,但簡潔性和性能將受到影響。 --- **[Back to contents of the chapter(返回章節目錄)](/Chapter-6/Chapter-6-Introduction.md)** - **Previous Item(上一條目):[Item 35: Use instance fields instead of ordinals(使用實例字段替代序數)](/Chapter-6/Chapter-6-Item-35-Use-instance-fields-instead-of-ordinals.md)** - **Next Item(下一條目):[Item 37: Use EnumMap instead of ordinal indexing(使用 EnumMap 替換序數索引)](/Chapter-6/Chapter-6-Item-37-Use-EnumMap-instead-of-ordinal-indexing.md)**
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看