亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

Effective Java讀書筆記二:枚舉和注解(30-37)

2019-11-14 11:21:07
字體:
來源:轉載
供稿:網友

第30條:用enum代替int常量

當需要一組固定常量的時候,應該使用enum代替int常量,除了對于手機登資源有限的設備應該酌情考慮enum的性能弱勢之外。

第31條:用實例域代替序數

枚舉的ordinal()方法會返回枚舉常量在類型中的數字位置, 但是盡量不要使用它,因為當重新排序后,會對客戶端造成破壞。 正確的做法是,將他保存在一個實例域中。

應該給enum添加int域,而不是使用ordinal方法來導出與枚舉關聯的序數值。(幾乎不應使用ordinal方法,除非在編寫像EnumMap這樣的基于枚舉的通用數據結構)

//WRONGpublic enum Fruit{ APPLE, PEAR, ORANGE; public int numberOfFruit(){ return ordinal() + 1; }}//RIGHTpublic enum Fruit{ APPLE(1), PEAR(2), ORANGE(3); PRivate final int number; Fruit(int num) {number = num;} public int numberOfFruit(){ return number; }}

第32條:用EnumSet代替位域

每個EnumSet的內容都表示為位矢量。如若底層的枚舉類型個數小于64個,則整個EnumSet就用單個long來表示,因此性能上比的上位域。

//WRONGpublic class Text{ private static final int STYLE_BOLD = 1 << 0; private static final int STYLE_ITALIC = 1 << 1; private static final int STYLE_UNDERLINE = 1 << 2; public void applyStyles(int styles) {...}}//usetext.applyStyles(STYLE_BOLD | STYLE_ITALIC);//RIGHTpublic class Text{ public enum Style{STYLE_BOLD, STYLE_ITALIC, STYLE_UNDERLINE} public void applyStyles(Set<Style> styles) {...} //這里不使用EnumSet<Style>參數是因為考慮到某些客戶端可能會傳遞一些其他的Set實現}//usetext.applyStyles(EnumSet.of(STYLE_BOLD, STYLE_ITALIC));EnumSet 實現了 Set 接口,提供了豐富的功能,類型安全.可以從其他任何Set中得到互換性.整個 EnumSet 就是用 單個 long 來表示的,性能上比得上 位運算的性能.總而言之因為枚舉類型要用在集合(Set)中,所以沒有理由用位域來表示.

第33條:用EnumMap代替序數索引

序數索引是指依賴于枚舉成員在枚舉中的序數來進行數組索引,如:

//定義了植物類,其中植物又分為水果,蔬菜,樹木三種public class Plant{ public enum Type { Fruit, Vegetables, Tree} private final String name; private final Type type; Plant(String name, Type type){ this.name = name; this.type = type; }}Set<Plant>[] plants = (Set<Plant>[]) new Set[Plant.Type.valuse().lenght]; //根據植物的類型,分別把所有的植物放入三個set中for(int i = 0; i < plant.lenght; i++){ plant[i] = new HashSet<Plant>();}for(Plant p : garden){ //garden里放了所有的植物 plant[p.type.ordinal()].add(p) //反面教材:利用了枚舉的序數來得到想要的數組索引,用戶在其他地方可以不使用ordinal函數,而直接使用int值來訪問,就可能出錯}

應該使用EnumMap來實現,EnumMap內部是采用數組實現的,具有Map的豐富功能和類型安全以及數組 的效率:

Map<Plant.Type, Set<Plant>> plants = new EnumMap<Plant.Type, Set<Plant>>(Plant.Type.class); //構造函數需要 鍵 類型的Class對象//根據植物的類型,分別把所有的植物放入三個set中for(Plant.Type type : Plant.Type.valuse()){ plant.put(type, new HashSet<Plant>);}for(Plant p : garden){ //garden里放了所有的植物 plant.get(p.type).add(p) //用戶必須使用正確的鍵值來訪問,即Type類型}

當需要多維關系時,可以使用EnumMap<…, EnumMap<…>>

第34條:用接口模擬可以伸縮的枚舉

1、如果讓一個 枚舉類型 去擴展另一個 枚舉類型,利用語言的特性,幾乎是不可能的 2、枚舉的可擴展性,到最后都證明不是一個好點子.

由于在java中enum不是可擴展的,在某些情況下,可能需要對枚舉進行擴展,比如操作類型(+-*/等),就可以考慮: 1.定義一個接口,比如public interface Operation{…}; 2.使枚舉繼承接口:比如public enum BasicOperation implements Operation{…} 3.使用時的API寫成接口(比如,T extends Enum & Operation),而不是實現(比如BasicOperation )

private static <T extends Enum<T> & Operation> void function(T t,..); //表示T即表示枚舉又是Operation的子類型

4.當需要擴展BasicOperation枚舉時,就可以另寫一個枚舉,且implements接口Operation

第35條:注解優先于命名模式

優先使用注解來表面針對某些程序元素的特定信息。 注解的優勢:

@Retention : 限定保留時期@Target: 限定其應用的程序元素還有很多注解,如 @IntDef,@ViewDebug…注解接收的參數如果是數組,為其賦值一個單獨的元素也是合法的

第36條:堅持使用Override注解

在想要覆蓋的方法上使用Override注解,編譯器就可以幫助發現一些錯誤??梢圆粚慜verride的特例:在具體類中不必標注你確信覆蓋了抽象方法聲明的方法(雖然這么做也沒有什么壞處)。

第37條:用標記接口實現類型

標記分為標記接口和標記注解。

標記接口:沒有包含方法聲明的接口,只是指明某個類實現了具有某種屬性的接口。比如Serializable接口,通過實現這個接口,類表明它的實例可以被寫到ObjectOutputStream。。

標記接口與標記注解的最終要的區別在于: 標記接口可以在編譯時就檢查到相應的類型問題,而標記注解則要到運行時。

標記接口優勢:

標記接口定義的類型是由 被標記的類的實例 實現的,標記注解 則沒有定義這樣的類型他們可以被更加精確的進行鎖定,比如 如果注解類型利用 @Target(ElementType.TYPE) 標記,則它可以被應用到任何類或者接口上

標記注解優勢:

它可以 通過默認的方式 添加 一個或者多個注解類型元素,給 已被使用的注解類型添加更多的信息.隨著時間的推移,簡單的標記注解類型可以演變成更加豐富的注解類型.他們是更大的注解機制的一部分.

使用:

如果標記是應用到任何程序元素而不是類或者接口,就必須使用注解. 因為只有 類和接口可以用來實現或者擴展接口如果標記只應用給類和接口,就應該 優先使用標記接口而非注解

《Effective Java中文版 第2版》PDF版下載: http://download.csdn.net/detail/xunzaosiyecao/9745699

作者:jiankunking 出處:http://blog.csdn.net/jiankunking


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲第一偷拍网| 国产精品视频在线观看| 亚洲高清一二三区| 丝袜亚洲欧美日韩综合| 亚洲精品aⅴ中文字幕乱码| 亚洲男人天堂2019| 亚洲人免费视频| 中文字幕精品在线视频| 国内精品伊人久久| 中文亚洲视频在线| 久久综合久中文字幕青草| 视频在线观看一区二区| 中文字幕av一区中文字幕天堂| 国产精品日韩在线观看| 亚洲精品wwww| 欧美亚洲国产日本| 亚洲欧美激情精品一区二区| 久久色免费在线视频| 国产mv免费观看入口亚洲| 亚洲成人av资源网| 国产精品偷伦免费视频观看的| 久久九九全国免费精品观看| 欧美午夜性色大片在线观看| 成人一区二区电影| 69av在线视频| 亚洲国产欧美一区二区三区同亚洲| 亚洲视频在线免费看| 久久av在线播放| 欧美黄网免费在线观看| 91热精品视频| 国产亚洲福利一区| 国产精品视频久| 美女少妇精品视频| 国产69久久精品成人看| 国产小视频91| 欧美成人在线网站| 国产精自产拍久久久久久蜜| 国产91精品网站| 国产精品精品视频一区二区三区| 亚洲精品一区二区在线| 久久在线观看视频| 欧美日韩国产丝袜美女| 日本欧美一二三区| 亚洲精品美女久久久| 91麻豆国产精品| 欧美日韩免费网站| 在线观看日韩欧美| 亚洲一区二区中文字幕| 91精品国产自产在线| 国产a∨精品一区二区三区不卡| 久久久免费高清电视剧观看| 国产成人精品在线观看| 一夜七次郎国产精品亚洲| 久久久精品视频成人| 欧美性xxxx在线播放| 欧美精品一本久久男人的天堂| 97热在线精品视频在线观看| 午夜精品久久17c| 情事1991在线| 欧美乱妇高清无乱码| 91精品免费久久久久久久久| 日本久久久久亚洲中字幕| 97av在线视频| 日韩成人小视频| 69视频在线免费观看| 亚洲人成在线观看网站高清| 国产精品美女视频网站| 精品国产精品自拍| 久久久爽爽爽美女图片| 欧美一级bbbbb性bbbb喷潮片| 国产精品久久久久久久天堂| 国产丝袜一区二区三区| 69视频在线播放| 欧美日本在线视频中文字字幕| 欧美性xxxx极品hd满灌| 亚洲va欧美va国产综合久久| 亚洲精品日韩激情在线电影| 日韩理论片久久| 国产91精品久久久久久| 欧美激情中文网| 国产一区二区三区高清在线观看| 伊人久久精品视频| 欧洲s码亚洲m码精品一区| 日韩精品亚洲视频| 亚洲精品乱码久久久久久按摩观| 国产婷婷色综合av蜜臀av| 69影院欧美专区视频| xxxxxxxxx欧美| 色婷婷亚洲mv天堂mv在影片| 国产日韩欧美在线视频观看| 国产精品免费福利| 亚洲一区二区精品| 国产精品久久999| 亚洲免费电影在线观看| 久久久久久久999精品视频| 欧美另类在线观看| 欧美视频中文在线看| 欧美日韩在线影院| 久久久久久久久久婷婷| 日韩一区二区三区在线播放| 中文字幕欧美在线| 欧美日韩福利电影| 青青草原成人在线视频| 91精品国产色综合久久不卡98| 91国内在线视频| 91国产一区在线| 日本精品性网站在线观看| 蜜月aⅴ免费一区二区三区| 久久久久女教师免费一区| 亚洲999一在线观看www| 国产精品极品尤物在线观看| 欧美成人激情视频免费观看| 久久久久久噜噜噜久久久精品| 欧美另类老女人| 亲子乱一区二区三区电影| 中文字幕视频一区二区在线有码| www.日韩av.com| 美乳少妇欧美精品| 亚洲国产精品久久久久久| 欧美国产日韩一区二区三区| 精品亚洲va在线va天堂资源站| 亚洲аv电影天堂网| 日韩欧美大尺度| 欧美最猛黑人xxxx黑人猛叫黄| 欧美老女人www| 亚洲成人激情在线观看| 最近中文字幕mv在线一区二区三区四区| 成人在线视频福利| 综合国产在线视频| 久久久久五月天| 热99精品里视频精品| 国产一区二区三区在线视频| 97精品国产97久久久久久免费| 欧美激情xxxxx| 亚洲欧美激情精品一区二区| 国产综合福利在线| 欧美高清不卡在线| 欧美日韩国产va另类| 成人h片在线播放免费网站| 国产精品九九久久久久久久| 一区二区三区www| 欧美亚洲国产日本| 欧美大片大片在线播放| 一区二区三区国产视频| 中文字幕免费精品一区高清| 国产精品美腿一区在线看| 91精品国产91久久久久久久久| 国产精品欧美日韩| 7777kkkk成人观看| 最新国产成人av网站网址麻豆| 中文字幕久久久| 北条麻妃在线一区二区| 国产小视频国产精品| 一区二区三区视频观看| 国产亚洲日本欧美韩国| 欧美影院成年免费版| 日韩欧亚中文在线| 日韩国产精品亚洲а∨天堂免| 久久视频免费观看| 26uuu久久噜噜噜噜| 精品女厕一区二区三区| 精品激情国产视频| 亚洲成人激情在线观看| 欧美成人精品一区|