本篇文章介紹下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的工具類中,有很多就是利用這種方法。