Java 私有構(gòu)造函數(shù)的應(yīng)用(轉(zhuǎn))

在Java中袒餐,構(gòu)造函數(shù)的訪問級別通常是public, 它提供了一個構(gòu)造該類對象的接口拴魄。可是你知不知道罕模,把構(gòu)造函數(shù)的級別設(shè)為private, 有一些特別用處。

先來看一段代碼:

//Shape.java
public class Shape {
    private Shape() { 
       /* set something here */
    }

    public static Shape makeShape(/* arglist */) {
       System.out.println("here is the shape you ordered");
       return (new Shape());
    }

    public static void main(String args[]) {
         Shape.makeShape();
    }
}

首先從語言角度分析帘瞭,我們可以知道淑掌, 任何類的使用者都無法使用構(gòu)造函數(shù)來生成一個圖形, 因?yàn)闃?gòu)造函數(shù)是私有的,無法被類以外的函數(shù)使用蝶念。而只能通過調(diào)用makeShape來實(shí)現(xiàn)抛腕。

也許你會問,為什么不直接使用構(gòu)造函數(shù)來生成圖形媒殉,而需要使用一個看上去多余的makeShape方法呢担敌?

這樣做有以下幾個好處:

1。你可以返回任何的Shape類型廷蓉,包括Shape的子類全封。比如你可以把makeShape寫成這樣:

       public static Shape makeShape(/* arglist */) {
       System.out.println("here is the shape you ordered");
       if (retangle)
             return (new Retangle(/* arglist*/));
       if (Circle) 
            return (new Circle(/* arglist */));
    /* you can return as many shapes as you like */
    }
這里假設(shè)Retangle 和 Circle 都是shape的子類,并且和Shape類在同一個包內(nèi)桃犬,Shape類可以訪問子類的構(gòu)造函數(shù)刹悴。這樣shape就提供了一個圖形工廠。 用戶通過一個接口就可以生成不同的圖形攒暇。事實(shí)上颂跨,這種用法被稱為“工廠模式”。

2扯饶『阆鳎可以實(shí)現(xiàn)一個類只有一個對象。請看下面的代碼

       //Handler.java
public class Handler {
    
    private Handler handler = null;
    private Handler() { 
       /* set something here */
    }

    public static getHandler(/* arglist */) {
        if (!handler)
             handler = new Handler();
       return handler;
    }

    public static void main(String args[]) {
         Handler.getHandler();
    }
}

當(dāng)handlerw為空時尾序,那么重新構(gòu)造一個handler钓丰,然后返回;如果已經(jīng)構(gòu)造過了每币,那么就直接返回已經(jīng)存在的handler携丁。這種用法被稱為“Singleton pattern". 如果直接使用構(gòu)造函數(shù)來構(gòu)造對象,那么你就無法控制生成的數(shù)量。在實(shí)際應(yīng)用中梦鉴,往往會做一些改變李茫。比如使用一個具有一定容量的池,當(dāng)需要構(gòu)造一個對象而池的容量仍未滿時肥橙,就構(gòu)造一個新的對象魄宏,并放入池中,并把對象的狀態(tài)設(shè)為“占用”狀態(tài)存筏;當(dāng)需要構(gòu)造一個對象而池的容量已滿宠互,則從池中選一個“空閑”狀態(tài)的對象返回,并把對象的狀態(tài)設(shè)為“占用”椭坚。當(dāng)對象使用完后再回收到池中并把狀態(tài)設(shè)為“空閑“予跌。

這種模式的一個典型應(yīng)用場景是:

在一個具有很多用戶的web站點(diǎn)里,需要一個對象來單獨(dú)處理一個連接善茎,而每一個連接的時間比較短券册。如果每次連接都創(chuàng)建一個對象然后又很快銷毀,那么創(chuàng)建和銷毀對象的系統(tǒng)開銷是很大的垂涯。這種時候可以使用對象池烁焙,這樣就免去了創(chuàng)建和銷毀對象的開銷。

3集币】稼澹可以方便的拋出異常翠忠。請看下列代碼:

public class Test {
  public Test() {
                double x = 1.0/0.0;
  }
  public static void main(String args[]) {
        try {
                Test test = new Test();
        }catch (Exception e){
                System.out.println(e.toString());
        }
  }
}

編譯鞠苟,執(zhí)行,你會發(fā)現(xiàn)這個異常不會被捕捉秽之,沒有任何輸出当娱;即使嘗試在構(gòu)造函數(shù)中捕捉異常也不行】颊ィ看下列代碼:

public class Test {
        public Test() {
                try {
                System.out.println("trying to throw an exception");
                double x = 1.0/0.0;
                } catch(Exception e) {
                        System.out.println("Exception captured");
                }finally {
                        System.out.println("inside finally");
                }
        }
        public static void main(String args[]) {
                Test test = new Test();
        }
}

編譯跨细,運(yùn)行,結(jié)果為:
trying to throw an exception
inside finally

原因是JVM把構(gòu)造函數(shù)產(chǎn)生的異常丟棄了河质。試想你正在使用一個第三方的類庫提供的類冀惭,那個類提供一個共有的構(gòu)造函數(shù),它允許你通過參數(shù)構(gòu)造一個類的對象掀鹅,可是如果你的參數(shù)不合法散休,導(dǎo)致在構(gòu)造函數(shù)中產(chǎn)生一個異常,那么你永遠(yuǎn)不知道具體發(fā)生了什么乐尊。當(dāng)然如可以在每次構(gòu)造對象時進(jìn)行參數(shù)合法性檢查戚丸,可是假設(shè)你要構(gòu)造好多這樣的對象?扔嵌?那將是一場災(zāi)難限府。這時可以通過把構(gòu)造函數(shù)的訪問級別設(shè)為私有夺颤,強(qiáng)迫類的使用者使用一個工廠函數(shù)來生成需要的對象,那么就可以在這個函數(shù)中統(tǒng)一的進(jìn)行參數(shù)檢查了胁勺。具體的代碼就不寫了世澜,留給讀者去實(shí)踐吧!

從上面的分析我們可以知道私有構(gòu)造函數(shù)的威力姻几。需要注意的一點(diǎn)是宜狐,即使你的構(gòu)造函數(shù)什么都不做,比如:
private Shape() {}
你仍然要顯示的定義蛇捌,因?yàn)槿绻悴欢x抚恒,那么Java會自動為你生成一個空構(gòu)造函數(shù),而這個空構(gòu)造函數(shù)是共有的络拌。

出處:http://blog.csdn.net/my_dream_fly/article/details/3857887

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末俭驮,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子春贸,更是在濱河造成了極大的恐慌混萝,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件萍恕,死亡現(xiàn)場離奇詭異逸嘀,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)允粤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進(jìn)店門崭倘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人类垫,你說我怎么就攤上這事司光。” “怎么了悉患?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵残家,是天一觀的道長。 經(jīng)常有香客問我售躁,道長坞淮,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任陪捷,我火速辦了婚禮回窘,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘揩局。我一直安慰自己毫玖,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著付枫,像睡著了一般烹玉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上阐滩,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天二打,我揣著相機(jī)與錄音,去河邊找鬼掂榔。 笑死继效,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的装获。 我是一名探鬼主播瑞信,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼穴豫!你這毒婦竟也來了凡简?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤精肃,失蹤者是張志新(化名)和其女友劉穎秤涩,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體司抱,經(jīng)...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡筐眷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了习柠。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片匀谣。...
    茶點(diǎn)故事閱讀 40,561評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖津畸,靈堂內(nèi)的尸體忽然破棺而出振定,到底是詐尸還是另有隱情必怜,我是刑警寧澤肉拓,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站梳庆,受9級特大地震影響暖途,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜膏执,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一驻售、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧更米,春花似錦欺栗、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽消请。三九已至,卻和暖如春类腮,著一層夾襖步出監(jiān)牢的瞬間臊泰,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工蚜枢, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留缸逃,地道東北人。 一個月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓厂抽,卻偏偏與公主長得像需频,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子筷凤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評論 2 359

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

  • 1.import static是Java 5增加的功能,就是將Import類中的靜態(tài)方法贺辰,可以作為本類的靜態(tài)方法來...
    XLsn0w閱讀 1,233評論 0 2
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法搭独,類相關(guān)的語法筷屡,內(nèi)部類的語法,繼承相關(guān)的語法金蜀,異常的語法吗伤,線程的語...
    子非魚_t_閱讀 31,664評論 18 399
  • 一:java概述:1吃靠,JDK:Java Development Kit,java的開發(fā)和運(yùn)行環(huán)境足淆,java的開發(fā)工...
    ZaneInTheSun閱讀 2,661評論 0 11
  • 面向?qū)ο笾饕槍γ嫦蜻^程巢块。 面向過程的基本單元是函數(shù)。 什么是對象:EVERYTHING IS OBJECT(萬物...
    sinpi閱讀 1,059評論 0 4
  • 想起母親的餃子巧号,不僅僅緣于微信圈里各類溫馨提示:冬至記得吃餃子族奢,五顏六色的餃子圖,令人口饞丹鸿,加上那親親的軟語...
    阿惠妹妹閱讀 413評論 3 7