Effective Java 讀書筆記(一)

ForCleanCode 為筆者讀書總結畅蹂,出于自身理解目的總結吭露!

JoshBloch.jpg

一丶對象的創(chuàng)建和銷毀
(一) 靜態(tài)工廠方法替代構造器

1.靜態(tài)工廠方法的幾大優(yōu)勢:

(1) 靜態(tài)工廠方法與傳統(tǒng)構造器方法不同的第一大優(yōu)勢 ,他們有名稱:

sample:返回一個素數(shù)

public static int BigInteger.probablePrime(int, int, Random){}

(2)不必再每次調用它的時候都創(chuàng)建一個新的對象:

sample:重復利用 預先創(chuàng)建好的實例谦屑,如布爾b

 /**
     * 1 確保他是一個Singleton
     * 2 可用 == 替代 equals,判斷相等 提升性能
     * @param b
     * @return
     */
 public static Boolean valueOf(boolean b){
        return b ? Boolean.TRUE:Boolean.FALSE;
    }

(3)可以返回原返回類型的任何子類型的對象流妻,提高靈活性

sample: java.util.EnumSet 為例子

/**
     * 1 如果他的元素<=64 return RegularEnumSet
     * 2 否則 return JumboEnumSet
     * 3 class RegularEnumSet<E extends Enum<E>> extends EnumSet<E> 都是他的子類
     * 4 對客戶端不可見 根據(jù)參數(shù)返回適配類型  更加靈活
     * @param elementType
     * @param <E>
     * @return
     */
    public static <E extends Enum<E>> EnumSet<E> noneOf(Class<E> elementType) {
        Enum<?>[] universe = getUniverse(elementType);
        if (universe == null)
            throw new ClassCastException(elementType + " not an enum");

        if (universe.length <= 64)
            return new RegularEnumSet<>(elementType, universe);
        else
            return new JumboEnumSet<>(elementType, universe);
    }

(4) 在創(chuàng)建參數(shù)化類型實例的時候痘拆,使代碼變得更加簡潔:

sample:已實例化單個HashMap為例子:

 /**
     * 傳統(tǒng)寫法
     *   缺點:如果HashMap參數(shù) 很多 特別冗長 卷拘,實例化起來寫長參數(shù) 會很麻煩
     */
    Map<String,List<String>> mMap = new HashMap<String, List<String>>();

    /**
     * 靜態(tài)工廠方法
     *      省下了手寫實例化后的參數(shù)
     */
    Map<String,List<String>> mStaticMap = newInstance();

    /**
     *  J神說 目前HashMap 并沒有工廠方法(可以放自己的工具類中)
     *      在以后java版本中可能會看到
     *      
     * @param <K>
     * @param <V>
     * @return
     */
    public static <K,V> HashMap<K,V> newInstance(){
        return new HashMap<K,V>();
    }

2丶靜態(tài)工廠方法的缺點

(1)類如果不含有公有的或者受保護的構造器喊废,就不能被子類化

sample: 比如 Collections 和 Framework, 構造方法私有化 肯定就不能被實例化了。栗弟。污筷。。

(2)靜態(tài)工廠與其他靜態(tài)方法實際沒有任何區(qū)別乍赫。

sample:
比如你實例化一個TextView 他是通過構造器 實例化的瓣蛀,你找到對應的對象通過Ctrl+左鍵和容易定位
到 該對象所實例化的構造方法。
但是通過靜態(tài)工廠 返回給你的實例化對象雷厂,是如何實例化的很難找到惋增。

    但是J神又說了  Javadoc總有一天會注意到這些靜態(tài)工廠方法的(但是目前 java8 還沒實現(xiàn) 嘻嘻嘻)

(二)遇到多個構造器參數(shù)時要考慮用構造器

靜態(tài)工廠和構造器有個共同的局限性:不能很好的擴展到大量的參數(shù)。

(1)從迭代構造器角度考慮:

sample:迭代構造器我們遇到了太多了改鲫,比如常見的自定義View


/**
 *  根據(jù)傳入參數(shù)的數(shù)量挨個迭代诈皿,直到三個參數(shù)的構造器為止
 * Created by zhaoyuanchao on 2018/4/21.
 */

public class SampleView extends View {
    public SampleView(Context context) {
        this(context, null);
    }

    public SampleView(Context context, @Nullable AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public SampleView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }
    
}

缺點:
構造器調用通常需要許多你根本不想設置的參數(shù),但是由于構造器限制 不得不為他傳值像棘, 如果有10個參數(shù)那種構造器稽亏,就會很快失去控制 相當?shù)牟混`活。

(2)JavaBean模式考慮:
sample:可以很好的處理每個必要的可選參數(shù)缕题,創(chuàng)建實例容易


/**
 * Created by zhaoyuanchao on 2018/4/21.
 */

public class SampleBean {
    private String a;
    private String b;

    public SampleBean() {
    }

    public void setA(String a) {
        this.a = a;
    }

    public void setB(String b) {
        this.b = b;
    }
}

缺點:
JavaBean 由于構造過程被分調到了 幾個方法中措左,所以無法通過構造器的有效參數(shù) 來保證該類的一致性。
線程不安全避除。

(3)Builder模式:
sample: 既能保證像構造器那樣的安全性怎披,也能保證像JavaBean那樣的可讀性。


public class NutritionFacts {
    private final int a;
    private final int b;
    private final int c ;
    private final int d;
    private final int e;
    private final int f;

    public static class Builder{
        // 如 a b 為必須傳入的值
        private final int a;
        private final int b;
        // c d e f為非必須傳入的值
        private  int c = 0;
        private  int d = 0;
        private  int e = 0;
        private  int f = 0;

        public Builder(int a , int b) {
            this.a = a;
            this.b = b;
        }

        public Builder setC(int val){
            c = val;
            //這里面為什么要為什么要return 自身呢? 為了方便鏈式調用復制 c d e f
            return this;
        }
        public Builder setD(int val){
            d = val;
            return this;
        }
        public Builder setE(int val){
            e = val;
            return this;
        }
        public Builder setF(int val){
            f = val;
            return this;
        }

        public NutritionFacts build(){
            return new NutritionFacts(this);
        }
    }

    private NutritionFacts(Builder builder){
        a = builder.a;
        b = builder.b;
        c = builder.c;
        d = builder.d;
        e = builder.e;
        f = builder.f;
    }
}

調用方法:

 /**
   * 很常見一種實例化方法吧瓶摆,我見過很多
   */
  NutritionFacts nutritionFacts = new NutritionFacts.Builder(10, 8).setC(1).
                setD(2).setE(3).setF(4).build();

缺點:
(1)為了創(chuàng)建對象凉逛,必須先創(chuàng)建Builder的構造器。
(2)Builder模式比重疊構造器更加冗長群井,只有在多參的時候才會用到(書上推薦>=4個參數(shù))状飞。

Builder模式的應用場景:
如果類的構造器或者靜態(tài)工廠中有多個參數(shù),Builder模式就是中不錯的選擇书斜!

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末诬辈,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子荐吉,更是在濱河造成了極大的恐慌焙糟,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件样屠,死亡現(xiàn)場離奇詭異穿撮,居然都是意外死亡缺脉,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進店門悦穿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來攻礼,“玉大人,你說我怎么就攤上這事栗柒〗赴纾” “怎么了?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵瞬沦,是天一觀的道長深员。 經常有香客問我,道長蛙埂,這世上最難降的妖魔是什么倦畅? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮绣的,結果婚禮上叠赐,老公的妹妹穿的比我還像新娘。我一直安慰自己屡江,他們只是感情好芭概,可當我...
    茶點故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著惩嘉,像睡著了一般罢洲。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上文黎,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天惹苗,我揣著相機與錄音,去河邊找鬼耸峭。 笑死桩蓉,一個胖子當著我的面吹牛,可吹牛的內容都是我干的劳闹。 我是一名探鬼主播院究,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼炼吴,長吁一口氣:“原來是場噩夢啊……” “哼鉴未!你這毒婦竟也來了?” 一聲冷哼從身側響起饿这,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤菩颖,失蹤者是張志新(化名)和其女友劉穎样漆,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體位他,經...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡氛濒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年产场,在試婚紗的時候發(fā)現(xiàn)自己被綠了鹅髓。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片舞竿。...
    茶點故事閱讀 40,680評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖窿冯,靈堂內的尸體忽然破棺而出骗奖,到底是詐尸還是另有隱情,我是刑警寧澤醒串,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布执桌,位于F島的核電站,受9級特大地震影響芜赌,放射性物質發(fā)生泄漏仰挣。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一缠沈、第九天 我趴在偏房一處隱蔽的房頂上張望膘壶。 院中可真熱鬧,春花似錦洲愤、人聲如沸颓芭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽亡问。三九已至,卻和暖如春肛宋,著一層夾襖步出監(jiān)牢的瞬間州藕,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工酝陈, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留慎框,地道東北人。 一個月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓后添,卻偏偏與公主長得像笨枯,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子遇西,可洞房花燭夜當晚...
    茶點故事閱讀 45,691評論 2 361

推薦閱讀更多精彩內容