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