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

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

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

2019-11-14 11:22:59
字體:
來源:轉載
供稿:網友

第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
久久久久免费精品国产| 国产小视频国产精品| 国产乱人伦真实精品视频| 欧美精品在线极品| 欧美裸体男粗大视频在线观看| 4438全国亚洲精品在线观看视频| 国产日韩欧美另类| 成人羞羞国产免费| 日韩精品亚洲元码| 一区二区三区视频在线| 成人av电影天堂| 中文字幕欧美亚洲| 欧美专区日韩视频| 国产精品一久久香蕉国产线看观看| 国产精品国产三级国产aⅴ9色| 午夜精品久久久久久99热软件| 精品福利视频导航| 亚洲激情在线观看| 亚洲国产日韩欧美在线99| 久久午夜a级毛片| 亚洲精品视频免费| 国产午夜精品全部视频在线播放| 亚洲男人天堂网站| 久久青草福利网站| 国产精品91久久久久久| 亚洲国产免费av| 欧美日韩国产中文字幕| 最好看的2019年中文视频| 深夜精品寂寞黄网站在线观看| 日韩美女av在线免费观看| 久久久精品久久久| 欧美成人免费网| 九九热最新视频//这里只有精品| 国产精品中文在线| 国产精品国模在线| 精品国模在线视频| 亚洲一区二区三区在线免费观看| 精品福利一区二区| 日韩欧美第一页| 亚洲人a成www在线影院| 久久精品视频va| 精品国产区一区二区三区在线观看| 久久99精品视频一区97| 中文字幕欧美精品在线| 1769国内精品视频在线播放| 欧美高清在线观看| 日韩精品在线观看一区二区| 亚洲成av人乱码色午夜| 欧美激情一区二区三区久久久| 亚洲国产成人在线播放| 国产精品视频公开费视频| 欧美整片在线观看| 人体精品一二三区| 2019日本中文字幕| 成人国产亚洲精品a区天堂华泰| 成人黄色免费网站在线观看| 国产精品www色诱视频| 日韩中文字幕不卡视频| 亚洲色图15p| 欧美中文字幕在线| 久久久在线免费观看| 欧洲一区二区视频| 日韩一区二区三区在线播放| 久久久久北条麻妃免费看| 国产日本欧美一区二区三区| 成人中文字幕+乱码+中文字幕| 国产98色在线| 久久久精品2019中文字幕神马| 岛国av午夜精品| 欧美成人亚洲成人日韩成人| 亚洲在线免费观看| 国产精品极品尤物在线观看| 中文字幕v亚洲ⅴv天堂| 国产成人久久久精品一区| 92裸体在线视频网站| 国产精品欧美一区二区三区奶水| 成人激情免费在线| xvideos亚洲| 欧美在线一级va免费观看| 日韩电影中文字幕| 一区二区亚洲欧洲国产日韩| 久久精品国产免费观看| 欧美男插女视频| 亚洲人成在线免费观看| 狠狠综合久久av一区二区小说| 在线日韩中文字幕| 国产精品一区二区三区久久| 中文字幕亚洲无线码在线一区| 欧美性猛交xxxx乱大交蜜桃| 色综合亚洲精品激情狠狠| 亚洲小视频在线观看| 国产精品视频xxxx| 欧美激情aaaa| 久久久女人电视剧免费播放下载| 色www亚洲国产张柏芝| 色偷偷噜噜噜亚洲男人| 激情成人在线视频| 57pao成人国产永久免费| 亚洲人成网站色ww在线| 亚洲伊人久久综合| 丝袜美腿精品国产二区| 久久国产精品电影| 日韩欧美在线视频观看| 夜夜嗨av色综合久久久综合网| 人九九综合九九宗合| 亚洲成人精品av| 精品人伦一区二区三区蜜桃网站| 国产欧美在线视频| 久久视频国产精品免费视频在线| 日韩专区中文字幕| 38少妇精品导航| 亚洲xxxx18| 97涩涩爰在线观看亚洲| 亚洲欧洲av一区二区| 日韩电视剧在线观看免费网站| 琪琪亚洲精品午夜在线| 亚洲图片欧洲图片av| 亚洲精品久久久久国产| 91精品国产色综合| 一区二区三区视频观看| 国产一区二区三区欧美| 亚洲欧美三级在线| 日韩高清中文字幕| 中文字幕成人精品久久不卡| 亚洲2020天天堂在线观看| 美日韩精品免费视频| 少妇久久久久久| 欧美日韩午夜剧场| 久久视频这里只有精品| 亚洲已满18点击进入在线看片| 国产精品吹潮在线观看| 国产视频一区在线| 国产精品久久久久久久久久久久| 国产亚洲激情视频在线| 国产美女被下药99| 91麻豆桃色免费看| 主播福利视频一区| 久久精品久久久久电影| 久久久久在线观看| 欧美夫妻性视频| 亚洲午夜性刺激影院| 成人精品久久一区二区三区| 亚洲免费高清视频| 日韩av在线不卡| 91大神在线播放精品| 亚洲国产精品推荐| 欧美另类在线观看| 欧美精品999| 日本国产高清不卡| 亚洲欧洲日本专区| 亚洲欧美第一页| 九九热最新视频//这里只有精品| 色综合久久久888| 日韩av高清不卡| 日本成人精品在线| 欧美性69xxxx肥| 欧美性生交xxxxx久久久| 欧美成人午夜剧场免费观看| 久久久久久综合网天天| 国产精品扒开腿做| 尤物九九久久国产精品的特点| 日韩成人av在线| 青草青草久热精品视频在线网站| 日韩欧中文字幕|