Java中EnumSet代替位域代碼詳解
本文研究的主要是Java中EnumSet代替位域的相關(guān)內(nèi)容,具體介紹如下。
位域表示法允許利用位操作,有效地執(zhí)行先 union(聯(lián)合)和 intersection(交集)這樣的集合操作。但是位域有著int枚舉常亮的所有缺點,甚至更多。當位域一數(shù)字形式打印時,翻譯位域比翻譯簡單的int枚舉常量要困難得多。甚至,要遍歷位域表示的所有元素都沒有很容易的方法。
//Bit field enumeration constant - OBSOLETE public 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類來有效地表示從單個枚舉類型中提取的多個值的多個集合。這個類實現(xiàn)Set接口,提供了豐富的功能,類型安全性,以及可以從任何其他Set實現(xiàn)中得到的互用性。但是在內(nèi)部具體的實現(xiàn)上,每個EnumSet內(nèi)容都表示為位矢量。如果底層的枚舉類型有64個或者更少的元素——大多數(shù)如此。整個EnumSet就用單個long來表示,因此它的性能比的上位域的性能。批處理,如removeAll和retainAll,都是利用位算法來實現(xiàn)的。就像手工替代位域?qū)崿F(xiàn)得那樣。但是可以避免手工操作時容易出現(xiàn)的錯誤以及不太雅觀的代碼,因為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) { System.out.println(styles); } public void test() { applyStyles(EnumSet.of(Style.BOLD, Style.ITALIC)); } }
執(zhí)行 test()
,輸出 [BOLD, ITALIC]
。
EnumSet 類集位域的簡潔和性能優(yōu)勢及枚舉類型的所有優(yōu)點于一身,所以我們沒有理由再使用位域表示法。除非是組成通信協(xié)議字段。
但實際上EnumSet也有一個缺點——它無法創(chuàng)建不可變的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
總結(jié)
以上就是本文關(guān)于Java中EnumSet代替位域代碼詳解的全部內(nèi)容,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!
相關(guān)文章
springMVC前臺傳數(shù)組類型,后臺用list類型接收實例代碼
這篇文章主要介紹了springMVC前臺傳數(shù)組類型,后臺用list類型接收實例代碼,具有一定借鑒價值,需要的朋友可以參考下。2017-12-12idea如何設(shè)置Git忽略對某些文件或文件夾的版本追蹤
這篇文章主要介紹了idea如何設(shè)置Git忽略對某些文件或文件夾的版本追蹤問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-03-03Spring中的@ExceptionHandler異常攔截器
這篇文章主要介紹了Spring中的@ExceptionHandler異常攔截器,Spring的@ExceptionHandler可以用來統(tǒng)一處理方法拋出的異常,給方法加上@ExceptionHandler注解,這個方法就會處理類中其他方法拋出的異常,需要的朋友可以參考下2024-01-01java后臺實現(xiàn)支付寶支付接口和支付寶訂單查詢接口(前端為APP)
這篇文章主要介紹了java后臺實現(xiàn)支付寶支付接口和支付寶訂單查詢接口(前端為APP),非常具有實用價值,需要的朋友可以參考下2018-08-08