久久精品精选,精品九九视频,www久久只有这里有精品,亚洲熟女乱色综合一区
    分享

    78條高質(zhì)量編碼建議《Effective Java》(1~2)閱讀筆記

     狼圖騰1224 2017-09-26

    Java經(jīng)典書籍《Effective Java(第二版)》相信大家都看過,此書共有78條關(guān)于編寫高質(zhì)量Java代碼的建議,這里是通俗易懂地講解,會(huì)持續(xù)全部更新完78條,希望大家每天讀一篇,一起學(xué)完這78條,相信可以寫出高質(zhì)量代碼。

    1.考慮靜態(tài)工廠方法代替構(gòu)造器

    通常情況下我們會(huì)利用類的構(gòu)造器對(duì)其進(jìn)行實(shí)例化,這似乎毫無疑問。但“靜態(tài)工廠方法”也需要引起我們的高度注意。
      什么是“靜態(tài)工廠方法”?這不同于設(shè)計(jì)模式中的工廠方法,我們可以理解它為“在一個(gè)類中用一個(gè)靜態(tài)方法來返回這個(gè)類的實(shí)例”,例如:

    publica static People getInsatance(){

            return new People();

    }


    它是一個(gè)“方法”,那么它不同于構(gòu)造器,它可以隨意修改方法名,這就帶來第一個(gè)優(yōu)點(diǎn)——有名稱。有時(shí)一個(gè)類的構(gòu)造器往往不止一個(gè),而它們的名稱都是相同的,不同的僅僅是參數(shù),如果不同參數(shù)帶來不同的含義這樣對(duì)于調(diào)用方來說除了注釋很難理解它們有什么不同的含義。例如BigInteger(int, int, Random)返回一個(gè)素?cái)?shù),但調(diào)用者很難理解API設(shè)計(jì)者所要想表達(dá)的意思,如果此時(shí)有BigInteger.probablePrime靜態(tài)工廠方法,則能一目了然的清楚API設(shè)計(jì)者所要想表達(dá)的含義。舉一個(gè)JDK的例子:Executors類,在這個(gè)類中有newFixedThread、newSingleThreadExecutor、newCachedThreadPool等靜態(tài)方法,因?yàn)樗鼈冇小懊帧保芯洼^為清晰的明白API的含義。

      《Effective Java》中所提到的靜態(tài)工廠方法第二個(gè)優(yōu)點(diǎn)在于不用重復(fù)創(chuàng)建一個(gè)對(duì)象,實(shí)際上也就是勤加載或者稱為餓漢式的單例模式。例如:

            public class Instance() {

                private static Instance instance = new Instance();

                private Instance(){}

                public static Instance getInstance() {

                return instance;

                }

            }

    靜態(tài)工廠方法的第三個(gè)優(yōu)點(diǎn),可以返回原返回類型的任何子類型的。這句話初看不好理解,舉個(gè)JDK中的例子:Collections類。

            List list = Collections.synchroizedList(new ArrayList())


    這個(gè)例子就說明了可以返回原返回類型的任何子類型的對(duì)象。
      關(guān)于靜態(tài)工廠方法的第四個(gè)優(yōu)點(diǎn),在創(chuàng)建參數(shù)化類型實(shí)例的時(shí)候,它們使代碼變得更加簡(jiǎn)潔,書中舉了一個(gè)例子:

            Map<String,List<String>> map = new HashMap<String,List<String>>()//繁瑣


    給集合類提供靜態(tài)工廠方法后:


            public static  <K,V>   HashMap<K,V> newInstance(){

                  return new HashMap<K,V>();

            }


            HashMap<String,List<String>> map = HashMap.newInstance();


    但是實(shí)際上從JDK7(包括JDK7)之后的集合類可以用以下簡(jiǎn)潔的代碼代替:


            Map<String,List<String>> map = new HashMap<>();


    靜態(tài)工廠方法也有兩個(gè)缺點(diǎn)一是公有的靜態(tài)方法所返回的非公有類不能被實(shí)例化,也就是說Collections.synchronizedList返回的SynchronizedList不能被實(shí)例化;二是查找API比較麻煩,它們不像普通的類有構(gòu)造器在API中標(biāo)識(shí)出來,而是和其他普通靜態(tài)方法一樣,鑒于此,書中提到了幾種慣用名稱:

      valueOf
      of  
      getInstance
      newInstance
      getType
      newType

    2,遇到不同參數(shù)的多個(gè)構(gòu)造器考慮用構(gòu)建器

       你經(jīng)常寫一下類似的代碼

        public class Student{

            private Sring name;

            

            private int age;

            

            private String sex;

            

            private String grade;

            

            public Student(String name, String sex){

                this(name,sex,0);

            }

            

           public Student(String name,String sex,int age){

               this(name,sex,age,'');


           }
          public Student(String name,String sex,int age,String grade){

              this.name=name;

              this.sex=sex;

              this.age=age;

              this.grade=grade;

         }

    }

    當(dāng)我想實(shí)例化一個(gè)名字叫“kevin”,性別男,但是不寫年齡,只有年級(jí)“1年級(jí)”,這個(gè)時(shí)候代碼就:不得不要為年齡這個(gè)參數(shù)傳遞值。如果新增一個(gè)只含年級(jí)的構(gòu)造方法,那又將多出許多代碼,更嚴(yán)重的是,如果沒有一份詳盡的文檔或者注釋,看到如此多的構(gòu)造方法將無從下手,這就是非常常見的重疊構(gòu)造器。

            Student student = new Student('joan','male','0','1年假');


    當(dāng)然還有另外一種方法,只有一個(gè)必填項(xiàng)的構(gòu)造方法,而其他選填項(xiàng)利用setter方法傳遞。例如:

            Student student = new Student('joan','male');

            student.setGrade('1年級(jí)');

    這實(shí)際上導(dǎo)致了在構(gòu)造過程中JavaBean可能處于不一致的狀態(tài),也就是說實(shí)例化對(duì)象本該是一氣呵成,但現(xiàn)在卻分割成了兩大步,這會(huì)導(dǎo)致它線程不安全,進(jìn)一步引發(fā)不可預(yù)知的后果。
      書中提到較為“完美”的解決方案就是利用“Builder模式(建造者模式)”,有關(guān)此設(shè)計(jì)模式可以查看《建造者模式》。這種解決方案屬建造者模式的一種形式,其核心就是不直接生成想要的對(duì)象,而是讓客戶端利用所有必要的參數(shù)調(diào)用構(gòu)造器(或者靜態(tài)工廠),得到一個(gè)builder對(duì)象,再調(diào)用類似setter的方法設(shè)置相關(guān)可選參數(shù)。構(gòu)建器模式如下所示:

            /**

             * 構(gòu)建器模式

             * Created by yulinfeng on 2017/8/3.

             */

            public class Student {

                /*必填*/

                private String name;

                private int age;

                /*選填*/

                private String sex;

                private String grade;

            

                public static class Builder {

                    private String name;

                    private int age;

                    private String sex = '';

                    private String grade = '';

            

                    public Builder(String name, int age) {

                        this.name = name;

                        this.age = age;

                    }

                    public Builder sex(String sex) {

                        this.sex = sex;

                        return this;

                    }

                    public Builder grade(String grade) {

                        this.grade = grade;

                        return this;

                    }

                    public Student build() {

                        return new Student(this);

                    }

                }

                private Student(Builder builder) {

                    this.name = builder.name;

                    this.age = builder.age;

                    this.sex = builder.sex;

                    this.grade = builder.grade;

                }

            }

     以上本質(zhì)上是個(gè)靜態(tài)內(nèi)部類
    客戶端代碼:

           Student student = new Student.Builder('joan','mea').grade('1年級(jí)').build();

    這樣的客戶端代碼很容易邊寫,并且便于閱讀。對(duì)于不了解的可能來說利用構(gòu)建器模式編寫Student類不算易事,甚至代碼比重疊構(gòu)造器的代碼更多。所以當(dāng)可選參數(shù)在很多時(shí),謹(jǐn)慎使用重疊構(gòu)造器,而是使用構(gòu)建器模式。


    今天就這么多了,明天持續(xù)更新,下期內(nèi)容:

    3.用私有構(gòu)造器或者枚舉類型強(qiáng)化Singleton屬性

    4.通過私又構(gòu)造器強(qiáng)化不可實(shí)例的能力



    Effective Java(第2版)PDF中英文(有源碼) 下載。

      本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
      轉(zhuǎn)藏 分享 獻(xiàn)花(0

      0條評(píng)論

      發(fā)表

      請(qǐng)遵守用戶 評(píng)論公約

      類似文章 更多

      主站蜘蛛池模板: 日韩有码中文在线观看| 精品亚洲精品日韩精品| 四虎影视一区二区精品| 2020国产欧洲精品网站| 国产真实伦在线观看视频| 国产麻豆成人传媒免费观看| 免费现黄频在线观看国产| 人妻少妇精品久久久久久| 最新国产精品好看的精品| 人人妻人人澡人人爽欧美二区| 亚洲中文字幕在线二页| FC2免费人成在线视频| 久久综合伊人77777| 欧美中文字幕无线码视频| 中国女人高潮hd| 国产精品久久久久影院亚瑟| 国产精品亚洲中文字幕| 亚洲另类无码一区二区三区| 国产熟睡乱子伦视频在线播放| 精品一区二区三区免费播放| 久热综合在线亚洲精品| 精品乱人伦一区二区三区| 免费人成视频网站在线18| 国产精品成人久久电影| 好紧好湿好黄的视频| 中文字幕av一区二区| 国产又爽又粗又猛的视频| 欧美韩中文精品有码视频在线 | 在线观看免费人成视频播放| 欧美成人免费做真爱| 国产成人a在线观看视频免费| 男人J进女人P免费视频| 国产成人午夜福利院| 东京热人妻无码一区二区av| 韩国V欧美V亚洲V日本V| 国内老熟妇乱子伦视频| 欧美交a欧美精品喷水| 蜜臀AV在线播放一区二区三区| 四虎影视国产精品永久在线 | 国产成人精品中文字幕| 亚洲AV无码不卡私人影院|