Effective Java 閱讀筆記(之創(chuàng)建和銷毀對象)

引言

本博客的內(nèi)容完全是為記錄自己的一些讀書感悟,如果喜歡可以進(jìn)行閱讀如有問題請指正廷支,謝謝频鉴。

思考

  1. 什么是構(gòu)造器,什么是靜態(tài)工廠方法恋拍?
  2. 什么時候用構(gòu)造器垛孔,什么時候用靜態(tài)工廠方法?

靜態(tài)工廠方法和構(gòu)造器

靜態(tài)工廠方法的優(yōu)點:

  1. 靜態(tài)方法是有名稱的施敢,有具體的名稱更易于使用者去閱讀和了解其功能似炎。如果我需要多個構(gòu)造器時辛萍,使用靜態(tài)工廠方法可能是最好的悯姊。多個構(gòu)造器除了參數(shù)類型等區(qū)分不同的功能再沒有其他的方式羡藐,極易用錯。但是靜態(tài)的構(gòu)工廠方法可以為每一個提供不同的名稱悯许,很容易區(qū)分仆嗦。這種情況使用靜態(tài)工廠是個好的實現(xiàn)方式。
  2. 靜態(tài)工廠方法了解加載機(jī)制的都知道先壕,它不會再每一次調(diào)用時都構(gòu)建一個新的對象瘩扼,對于頻繁調(diào)用時是一個不錯的方式。
  3. 靜態(tài)工廠方法有返回值垃僚,在某種用途上我們能夠更好的實現(xiàn)集绰。例如后面的構(gòu)建器。
  4. 實例化參數(shù)類型時更加的簡潔明了谆棺。
    //實例化時
    Map<String, List<String>> map = new HashMap<String, List<String>>();
    //Google Guava提供的靜態(tài)實例化方法
    public static<K, V> HashMap<K, V> newHashMap(){
        reutrn new HashMap<K, V>();
    }
    //實例化時
    Map<String, List<String>> map = Maps.newHashMap();

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

  1. 類如果沒有構(gòu)造器栽燕,就不能被子類去類化。
  2. 它們與其他的靜態(tài)方法沒什么區(qū)別改淑。API文檔中不會提供靜態(tài)方法的說明碍岔,有時候你可能只看文檔無法知道如何實例化一個類(當(dāng)然看源碼很容易就知道了)

使用構(gòu)建器

  1. 使用構(gòu)造器是解決靜態(tài)工廠和構(gòu)造器的局限性,它們不能很好的擴(kuò)展到大量的可選擇參數(shù)朵夏。
  2. 普通的要靈活的使用構(gòu)造的參數(shù)個數(shù)可能要寫大量的構(gòu)造器去處理蔼啦,相當(dāng)?shù)姆爆崱?/li>
  3. 前期可能使用的參數(shù)較少感覺使用構(gòu)建器反而更復(fù)雜,但是后期擴(kuò)展時很方便仰猖。

構(gòu)建器的實現(xiàn):

    public class Build {

    private String name;
    private Integer age;
    private String desc;

    public static class BuildForm {
        private String name;
        private Integer age;
        private String desc;

        public BuildForm() {

        }

        public BuildForm nameBuild(String name) {
            this.name = name;
            return this;
        }

        public BuildForm ageBuild(Integer age) {
            this.age = age;
            return this;
        }

        public BuildForm descBuild(String decs) {
            this.desc = decs;
            return this;
        }

        public Build buildData() {
            return new Build(this);
        }

    }
    //創(chuàng)建私有構(gòu)造器防止調(diào)用默認(rèn)構(gòu)造器處理和處理內(nèi)部賦值
    private Build(BuildForm buildForm){
        this.name = buildForm.name;
        this.age = buildForm.age;
        this.desc = buildForm.desc;
    }

    @Override
    public String toString() {
        return "Build{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", desc='" + desc + '\'' +
                '}';
    }
}

構(gòu)建器的使用:

public class Main {

    public static void main(String[] argv) {
        Build buildOne = new Build.BuildForm()
        .nameBuild("AA")
        .buildData();
        Build buildTwo = new Build.BuildForm()
        .nameBuild("BB")
        .ageBuild(12)
        .buildData();
        Build buildThree = new Build.BuildForm()
        .nameBuild("CC")
        .ageBuild(12)
        .descBuild("啊哈哈")
        .buildData();

        System.out.println(buildOne.toString());
        System.out.println(buildTwo.toString());
        System.out.println(buildThree.toString());

    }

}

測試結(jié)果如下:

Build{name='AA', age=null, desc='null'}
Build{name='BB', age=12, desc='null'}
Build{name='CC', age=12, desc='啊哈哈'}

以上就是一個簡單的構(gòu)建器捏肢,大家可以根據(jù)自己的需求去使用。

單例屬性的強(qiáng)化

私有的構(gòu)造器

就如同我上面代碼中寫到的饥侵,如果不使用私有的構(gòu)造器去處理類鸵赫,雖然我們的實現(xiàn)是單例的,但是使用者完全可以使用默認(rèn)的構(gòu)造器去創(chuàng)建出來新的對象爆捞,有時候就違背我們的初衷奉瘤。

枚舉的方式

我們可以使用枚舉的方式去創(chuàng)建一個單例模式,這樣就不會出現(xiàn)上述的情況煮甥。創(chuàng)建的方式如下代碼:

//創(chuàng)建一個類
public class Factory {
}
//枚舉的方式實例化類
public enum  EnumFactory {
    DATE;
    private Factory factory;
    public void buildSingleton(){
        factory = new Factory();
    }
    public Factory getFactory(){
        return factory;
    }
}
//類的使用
public class Main {

    public static void main(String[] argv) {
        Factory factory = EnumFactory.DATE.getFactory();
    }

}

三種單例的創(chuàng)建模式盗温,枚舉的方式可能是現(xiàn)在做好的方法。

對象的銷毀

內(nèi)存泄露

對象有創(chuàng)建必然存在銷毀成肘,java提供有自己的垃圾回收機(jī)制卖局。但是并不代表java不會出現(xiàn)內(nèi)存泄露。所以我們需要消除過期的對象引用双霍,若過期的對象引用一直存在垃圾回收器就不會去回收資源砚偶。一般這種情況發(fā)生在引用緩存中批销。開發(fā)中要注意這類情況。下面是三種容易發(fā)生內(nèi)存泄露的情況染坯。

  1. 無意識的泄露均芽,一般是代碼考慮不周全導(dǎo)致,沒有考慮泄露的意識单鹿。
  2. 緩存中存放的對象掀宋,一般需要去維護(hù),不然容易出現(xiàn)泄露仲锄。
  3. 監(jiān)聽器和回調(diào)劲妙,這種情況一般是需要維護(hù)對象的長期有效的,但是使用完成如果不進(jìn)行注銷就會出現(xiàn)泄露儒喊。

避免使用終結(jié)方法

java有提供終結(jié)方法來讓開發(fā)者去終結(jié)镣奋,但是終結(jié)方法的線程優(yōu)先級極低,我們并不能去確定終結(jié)方法一定會執(zhí)行怀愧,有不能確定終結(jié)方法執(zhí)行的時間侨颈。當(dāng)然有些情況是需要去使用終結(jié)方法的,例如流的關(guān)閉掸驱,一般要配合try....finally來使用肛搬。

結(jié)束語

一些簡單的介紹,如果要很好的了解建議大家親自去看看這本書毕贼。希望淺薄的理解能對你的開發(fā)有幫助温赔。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市鬼癣,隨后出現(xiàn)的幾起案子陶贼,更是在濱河造成了極大的恐慌,老刑警劉巖待秃,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拜秧,死亡現(xiàn)場離奇詭異,居然都是意外死亡章郁,警方通過查閱死者的電腦和手機(jī)枉氮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來暖庄,“玉大人聊替,你說我怎么就攤上這事∨嗬” “怎么了惹悄?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長肩钠。 經(jīng)常有香客問我泣港,道長暂殖,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任当纱,我火速辦了婚禮呛每,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘惫东。我一直安慰自己莉给,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布廉沮。 她就那樣靜靜地躺著,像睡著了一般徐矩。 火紅的嫁衣襯著肌膚如雪滞时。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天滤灯,我揣著相機(jī)與錄音坪稽,去河邊找鬼。 笑死鳞骤,一個胖子當(dāng)著我的面吹牛窒百,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播豫尽,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼篙梢,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了美旧?” 一聲冷哼從身側(cè)響起渤滞,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎榴嗅,沒想到半個月后妄呕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡嗽测,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年绪励,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片唠粥。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡疏魏,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出厅贪,到底是詐尸還是另有隱情蠢护,我是刑警寧澤,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布养涮,位于F島的核電站葵硕,受9級特大地震影響眉抬,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜懈凹,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一蜀变、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧介评,春花似錦库北、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至坪仇,卻和暖如春杂腰,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背椅文。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工喂很, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人皆刺。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓少辣,卻偏偏與公主長得像,于是被迫代替她去往敵國和親羡蛾。 傳聞我的和親對象是個殘疾皇子漓帅,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,728評論 2 351

推薦閱讀更多精彩內(nèi)容