優(yōu)雅編程之這樣使用對象邑飒,你就“正逞”了(三十二)

開心一笑

【一個四歲的男孩親了三歲的女孩一口!
女孩對男孩說:“你親了我可要對我負責啊疙咸∠亟常”
男孩成熟地拍了拍女孩的肩膀,笑著說:“你放心,我都四歲了,又不是一兩歲的小孩子了” 】

**提出問題******

項目中如何使用對象???

解決問題

溫馨圖片

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

例:

public static Boolean valueOf(boolean b) {
    return (b ? Boolean.TRUE : Boolean.FALSE);
}

靜態(tài)方法和構(gòu)造器相比優(yōu)勢:

  • 靜態(tài)方法有名稱续膳,構(gòu)造器沒有:一個類只能有一個帶有指定簽名的構(gòu)造器。如果需要2個兰粉,它們的參數(shù)列表只在參數(shù)類型的順序上有所不同。這并不是個好主意顶瞳。

  • 靜態(tài)方法不必在每次調(diào)用它們的時候都創(chuàng)建一個新的對象玖姑。

  • 靜態(tài)方法可以返回原返回類型的任何子類型的對象。例如:Java Collections的集合接口有32個便利實現(xiàn)慨菱,每種便利實現(xiàn)都對應一個類客峭。

  • 靜態(tài)方法在創(chuàng)建參數(shù)化類型實例的時候,它們使代碼變得更加簡潔抡柿。

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

    //以后工作就用這種方法了,不過遺憾的告訴大家目前jdk沒改類似方法
    Map<String,List<String>> m = HashMap.newInstance();

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

  • 類如果不含公有的或者受保護的構(gòu)造器等恐,就不能被子類化洲劣。不能子類化在某些情況下是無法接受的,但是课蔬,這樣也有好處:策略模式教導我們應該多用組合而不是繼承囱稽,當一個類不能子類化后,組合將是你唯一的選擇二跋。
  • 靜態(tài)工廠方法和其他靜態(tài)方法本質(zhì)上并沒有區(qū)別

依靠一些約定俗稱的名稱分辨基本的靜態(tài)工廠方法战惊。具體包括:

valueOf()       //方法返回的實例與參數(shù)具有相同的值
of()            //valueOf 的簡化表示
getInstance()   //返回的實例通過參數(shù)來描述
newIntance()    //返回一個與現(xiàn)有實例不同的全新實例
getType()       //Type 表示返回的對象類型,如 getString() 返回一個String對象
newType()       //返回一個全新的 Type 類型的對象

總結(jié):

靜態(tài)方法通常更加合適扎即,因此切記第一方法就是提供共有的構(gòu)造器吞获,而不先考慮靜態(tài)工廠况凉。


遇到多個構(gòu)造器參數(shù)時要考慮構(gòu)造器

重疊構(gòu)造器模式:第一個構(gòu)造器只有一個必要參數(shù),第二個有一個可選參數(shù)各拷,第三個有兩個刁绒,以此類推,最后一個構(gòu)造器有全部的可選參數(shù)烤黍。創(chuàng)建實例的時候知市,選擇最短的列表參數(shù)的構(gòu)造器,當有許多參數(shù)的時候速蕊,客戶端代碼會很難編寫

參考高手文章:http://macrochen.iteye.com/blog/1113031

解決方法:采用構(gòu)建器(Builder)

public Class A{  
    private int a;  
    private int b;  
    private int c;  
    private int d;  
    public static class Builder{  
        // 這些是必要參數(shù)
        private final int a;  
        private final int b;  
        //這些是可選參數(shù)
        private int c;  
        private int d;  
  
        public Builder(int a, int b){  
            this.a=a;  
            this.b=b;  
        }  
  
        public Builder setC(int c){  
            this.c = c; 
            //注意是這里嫂丙,這里,看過來规哲,看過來 
            return this;  
        }  
  
        public Builder setD(int d){  
            this.d=d;  
            return this;  
        }  
  
        public A build(){  
            return new A(this);  
        }  
  
        private A(Builder builder){  
            a = builder.a;  
            b = builder.b;  
            c = builder.c;  
            d = builder.d;  
        }  
}  
使用:  
A a = new A.Builder(1, 2).setC(3).setD(4).build();  

總結(jié):

如果類的構(gòu)造器或者靜態(tài)工廠中具有多個參數(shù), 設計這種類時, Builder模式就是一種不錯的選擇. 特別是大多數(shù)參數(shù)都是可選的時候. 與使用傳統(tǒng)的重載構(gòu)造器模式相比, 使用Builder模式的客戶端將更易于閱讀和編寫.


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

Singleton指被實例化一次的類跟啤。

參考高手文章:http://www.cnblogs.com/rilley/archive/2012/10/24/2737597.html

例:

//這種寫法存在缺陷,可以利用反射的方式來實例化多個不同的實例
//序列化和反序列換的時候也會出現(xiàn)多個不同的實例
public class Elvis {
  public static final Elvis INSTANCE = new Elvis();
  private Elvis {}
}

參考高手文章:http://blog.csdn.net/huangyuan_xuan/article/details/52193006

或者:

public class Elvis {
  private staic final Elvis INSTANCE = new Envis();
  private Elvis() {}
  private static Elvis getInstance() { 
        //開過來媳叨,這里很重要
        return INSTANCE; 
    }
}

或者:

public enum Elvis{ 
    INSTANCE; 
    public void invoke(){...} 
} 

參考高手文章:http://callmegod.iteye.com/blog/1474441

public enum MaYun {
    himself; //定義一個枚舉的元素腥光,就代表MaYun的一個實例
    private String anotherField;
    MaYun() {
        //MaYun誕生要做的事情
        //這個方法也可以去掉。將構(gòu)造時候需要做的事情放在instance賦值的時候:
        /** himself = MaYun() {
        * //MaYun誕生要做的事情
        * }
        **/
    }

    public void splitAlipay() {
        System.out.println(“Alipay是我的啦糊秆!看你丫Yahoo綠眉綠眼的望著武福。。痘番∽狡”);
    }
}
Call:MaYun.himself.splitAlipay();

單元素的枚舉類型已經(jīng)成為實現(xiàn)Singleton的最佳方法。

枚舉:很好汞舱,不僅能避免多線程同步問題伍纫,而且還能防止反序列化重新創(chuàng)建新的對象。但是失去了類的一些特性昂芜,沒有延遲加載莹规,用的人也太少了~~

以后多推廣推廣單元素枚舉這種更好的單例實現(xiàn)方式。在項目中的代碼開始修改實施泌神。


通過私有構(gòu)造器強化不可實例化的能力
  • 對只有靜態(tài)方法和域的類良漱,主要用于把基本類型的值或數(shù)據(jù)類型上的相關方法組織起來(Math,Arrays)欢际,可以通過Collections的方法把實現(xiàn)特定接口的對象上的驚天方法組織起來母市,可以利用這種類把final類上的方法組織起來,以取代擴展該類的做法损趋。
  • 此工具類是不希望被實例化的患久,實例化對他么有任何意義。然后我們?nèi)绻惶峁?gòu)造器,jvm會自己提供蒋失,那還是會被實例化返帕,那么我們只要在類中提供一個私有的構(gòu)造器就可以了,并添加注釋說明高镐。
    這樣帶來的問題是不能子類化溉旋,因為子類要求要求super父類的構(gòu)造函數(shù)。

避免創(chuàng)建不必要的對象

一般來說嫉髓,最好能重用對象观腊,而不是在每次需要的時候,就創(chuàng)建一個相同功能的對象算行,如果對象是不可變的梧油,他就始終可以被重用。

例如
//"ay & al" 本身就是一個對象州邢,這樣寫的話儡陨,頻繁調(diào)用會造成成千上萬不必要的String實例
String s = new String("ay & al");

改進

String s = "al & ay";

對于同時提供的靜態(tài)工廠方法和構(gòu)造器的不可變類,通沉刻剩可以使用靜態(tài)工廠方法骗村,而不是構(gòu)造器,以避免創(chuàng)建不必要的對象呀枢。

例如

Boolean.valueOf(String)

優(yōu)于

Boolean(String)

要優(yōu)先使用基本類型而不是裝箱基本類型胚股,要當心無意識的自動裝箱。

例如

public static void main(String[] args){
    Long sum = 0L;
    for(long i=0;i<Integer.MAX_VALUE;i++){
        sum + = i;//在這里不斷的進行裝箱和拆箱工作
    }
    System.out.println(sum);
}

消除過期的對象引用

清空引用對象應該是一種例外, 而不是一種規(guī)范行為

以下三種情況要考慮會發(fā)生內(nèi)存泄露:

  • 類自己申請內(nèi)存管理
  • 緩存裙秋,易忘記管理琅拌,如WeakHashMap可以自動處理沒有被外部引用的緩存項。一般利用后臺線程定時清理摘刑,也可以類似LinkedHashMap使用removeEldestEntry在添加條目時清理进宝。對于復雜的緩存,必須直接使用java.lang.ref
  • 監(jiān)聽器和其他回調(diào)枷恕,回調(diào)此時可以做成弱引用党晋。

只要是類自己管理內(nèi)存, 程序員就應該警惕內(nèi)存泄露的問題.

讀書感悟

來自杰克·凱魯亞克《在路上》

  • 真正不羈的靈魂不會真的去計較什么,因為他們的內(nèi)心深處有國王般的驕傲徐块。
  • 我還年輕隶校,我渴望上路。帶著最初的激情蛹锰,追尋著最初的夢想,感受著最初的體驗绰疤,我們上路吧铜犬。
  • 在路上,我們永遠年輕,永遠熱淚盈眶癣猾。
  • 我們還有更長的路要走敛劝,不過沒關系,道路就是生活纷宇。
  • “我一輩子都喜歡跟著讓我有感覺有興趣的人夸盟,因為在我心目中,真正的人都是瘋瘋癲癲的像捶,他們熱愛生活上陕,愛聊天,不露鋒芒拓春,希望擁有一切释簿,他們從不疲倦,從不講些平凡的東西硼莽,而是像奇妙的黃色羅馬煙火那樣庶溶,不停地噴發(fā)火花。

其他

如果有帶給你一絲絲小快樂懂鸵,就讓快樂繼續(xù)傳遞下去偏螺,歡迎轉(zhuǎn)載,點贊匆光,頂套像,歡迎留下寶貴的意見,多謝支持殴穴!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末凉夯,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子采幌,更是在濱河造成了極大的恐慌劲够,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件休傍,死亡現(xiàn)場離奇詭異征绎,居然都是意外死亡,警方通過查閱死者的電腦和手機磨取,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進店門人柿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人忙厌,你說我怎么就攤上這事凫岖。” “怎么了逢净?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵哥放,是天一觀的道長歼指。 經(jīng)常有香客問我,道長甥雕,這世上最難降的妖魔是什么踩身? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮社露,結(jié)果婚禮上挟阻,老公的妹妹穿的比我還像新娘。我一直安慰自己峭弟,他們只是感情好附鸽,可當我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著孟害,像睡著了一般拒炎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上挨务,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天击你,我揣著相機與錄音,去河邊找鬼谎柄。 笑死丁侄,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的朝巫。 我是一名探鬼主播鸿摇,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼劈猿!你這毒婦竟也來了拙吉?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤揪荣,失蹤者是張志新(化名)和其女友劉穎筷黔,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體仗颈,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡佛舱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了挨决。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片请祖。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖脖祈,靈堂內(nèi)的尸體忽然破棺而出肆捕,到底是詐尸還是另有隱情,我是刑警寧澤盖高,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布福压,位于F島的核電站掏秩,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏荆姆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一映凳、第九天 我趴在偏房一處隱蔽的房頂上張望胆筒。 院中可真熱鬧,春花似錦诈豌、人聲如沸仆救。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽彤蔽。三九已至,卻和暖如春庙洼,著一層夾襖步出監(jiān)牢的瞬間顿痪,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工油够, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蚁袭,地道東北人。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓石咬,卻偏偏與公主長得像揩悄,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子鬼悠,可洞房花燭夜當晚...
    茶點故事閱讀 43,486評論 2 348

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