Java中EnumSet代替位域代碼詳解,javaenumset詳解

來源:互聯網
上載者:User

Java中EnumSet代替位域代碼詳解,javaenumset詳解

本文研究的主要是Java中EnumSet代替位域的相關內容,具體介紹如下。

讀書筆記《Effective Java 中文版 第2版》

位域標記法允許利用位操作,有效地執行先 union(聯合)和 intersection(交集)這樣的集合操作。但是位域有著int枚舉常亮的所有缺點,甚至更多。當位域一數字形式列印時,翻譯位域比翻譯簡單的int枚舉常量要困難得多。甚至,要遍曆位域表示的所有元素都沒有很容易的方法。

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

java.util 包提供了EnumSet類來有效地表示從單個枚舉類型中提取的多個值的多個集合。這個類實現Set介面,提供了豐富的功能,型別安全,以及可以從任何其他Set實現中得到的互用性。但是在內部具體的實現上,每個EnumSet內容都表示為位向量。如果底層的枚舉類型有64個或者更少的元素——大多數如此。整個EnumSet就用單個long來表示,因此它的效能比的上位域的效能。批處理,如removeAll和retainAll,都是利用位演算法來實現的。就像手工替代位域實現得那樣。但是可以避免手工操作時容易出現的錯誤以及不太雅觀的代碼,因為EnumSet替你完成了這項艱巨的工作。`

//EnumSet - a modern replacement for bit fieldspublic 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) {     System.out.println(styles);  }  public void test() {    applyStyles(EnumSet.of(Style.BOLD, Style.ITALIC));  }}

執行 test() ,輸出 [BOLD, ITALIC] 。

EnumSet 類集位域的簡潔和效能優勢及枚舉類型的所有優點於一身,所以我們沒有理由再使用位域標記法。除非是組成通訊協定欄位。

但實際上EnumSet也有一個缺點——它無法建立不可變的EnumSet,但我們可以用Collections.unmodifiableSet將EnumSet封裝起來,但是簡潔性和效能都會受到影響。

public void test() {  EnumSet<Style> styles = EnumSet.of(Style.BOLD, Style.ITALIC);  Set<Style> unmodifiableStyle = Collections.unmodifiableSet(styles);  unmodifiableStyle.add(Style.UNDERLINE);}

這樣如果往 unmodifiableSet 中添加元素就會報 java.lang.UnsupportedOperationException

總結

以上就是本文關於Java中EnumSet代替位域代碼詳解的全部內容,希望對大家有所協助。感興趣的朋友可以繼續參閱本站其他相關專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支援!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.