Java私有構造函數的使用

本篇文章介紹下Java,私有構造函數的使用。

Java私有構造函數的使用

當我們學習Java的時候,我們接觸到的構造函數的權限修飾符都是public,比如,

public class Test {
    public Test() {

    }
    }
}

我們,知道構造函數的用途是創建一個對象,並返回。比如,

Test instance = new Test();

如果你很瞭解java的權限修飾符的話(若不是,請移步百度搜索),你是否會疑問,構造函數能否是private的呢?
答案是yes。

由於private的緣故,被private修飾的構造函數無法在其他類中調用,也就是該類無法在其他類中實例化。那不僅要問,那還要構造函數做什麼?

既然,Java允許構造函數的私有化,那肯定是有一定的道理。我們簡要介紹其兩種情景。

單例模式

如果你瞭解過設計模式,那你一定會知道單例模式,這是最初級的設計模式之一。
一個最簡單的單例模式如下,更復雜的單例模式,請參考[http://blog.csdn.net/u014088294/article/details/49838831]

public class Singleton {

    private static Singleton instance;

    private Singleton() {
        // .......//
    }

    public Singleton getInstance() {

        if (instance == null)
            instance = new Singleton();
        return instance;
    }

}

單例模式主要有3個特點,
1. 類的內部包括一個類的實力,並且爲static類型
2. 構造函數爲私有
3. 通過提供一個獲取實例的方法,比如getInstance,該方法也爲static類型。
調用的時候,我們可以通過

Singleton instance = Singleton.getInstance();

來得到其實例化。

你也許會問,爲什麼要用單例模式呢?這是因爲, 很多時候,我們只需要一個對象就可以了,不希望用戶來構造對象,比如線程池,驅動,顯示器等。如果把構造函數私有,那麼很多程序都可以得到其實例,將會帶來混亂。

防止實例化

私有構造函數的第二個用途,就是防止實例化。你又要問了,一個類,不能實例化,還要它有啥用?!
哈哈,那是你忘了static關鍵詞了,static的意思是靜態,什麼是靜態呢,如果一個變量或方法設置爲static,那麼它就不依賴其所在的對象。
一個簡單的例子,

public class StaticTest {
    public static int a;
    public int b;

    public static void menthoA() {
        // ...//
    }

    public static void main(String[] args) {
        int c = StaticTest.a;
        StaticTest.menthoA();

        StaticTest instance = new StaticTest();
        int d = instance.b;
    }

}

由於a爲static類型,所以我們可以直接通過類名StaticTest.a來獲取到a,對於方法menthoA而是,但是對於非static變量和方法, 我們必須實例化才能訪問,比如變量b。
當然了,我們而可以通過instance.a來訪問a,不過這樣是不是顯的多餘呢?通常我們不這麼做。

上面的例子,是存在構造函數,考慮如下情形,我們有一個工具類Utils,裏面含有很多靜態函數或者靜態變量,由於靜態的原因,我們完全可以通過類名來訪問,這樣,我們就沒有必要實例化它們,所以我們可以將其構造函數設置爲私有,這樣就防止用戶濫用。
在Java的工具類中,有很多就是利用這種方法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章