Java中EnumSet代替位域代碼詳解
本文研究的主要是Java中EnumSet代替位域的相關(guān)內(nèi)容,具體介紹如下。
位域表示法允許利用位操作,有效地執(zhí)行先 union(聯(lián)合)和 intersection(交集)這樣的集合操作。但是位域有著int枚舉常亮的所有缺點(diǎn),甚至更多。當(dāng)位域一數(shù)字形式打印時(shí),翻譯位域比翻譯簡(jiǎn)單的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類來有效地表示從單個(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來表示,因此它的性能比的上位域的性能。批處理,如removeAll和retainAll,都是利用位算法來實(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)于一身,所以我們沒有理由再使用位域表示法。除非是組成通信協(xié)議字段。
但實(shí)際上EnumSet也有一個(gè)缺點(diǎn)——它無法創(chuàng)建不可變的EnumSet,但我們可以用Collections.unmodifiableSet將EnumSet封裝起來,但是簡(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)文章
java反射之Method的invoke方法實(shí)現(xiàn)教程詳解
這篇文章主要給大家介紹了關(guān)于java反射之Method的invoke方法的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01
SpringBoot定義Bean的幾種實(shí)現(xiàn)方式
本文主要介紹了SpringBoot定義Bean的幾種實(shí)現(xiàn)方式,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05
JS求多個(gè)數(shù)組的重復(fù)數(shù)據(jù)
這篇文章主要介紹了JS求多個(gè)數(shù)組的重復(fù)數(shù)據(jù)的辦法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-09-09
解析Spring Boot 如何讓你的 bean 在其他 bean&n
在 SpringBoot 中如何讓自己的某個(gè)指定的 Bean 在其他 Bean 前完成被 Spring 加載?我聽到這個(gè)問題的第一反應(yīng)是,為什么會(huì)有這樣奇怪的需求?下面小編給大家分析下Spring Boot 如何讓你的 bean 在其他 bean 之前完成加載 ,感興趣的朋友一起看看吧2024-01-01

