java中構造方法私有化
1. 類中的封裝性不光體現在對屬性的封裝上,實際上方法也是可以被封裝的,當然在方法封裝中也包含了對構造方法的封裝。
舉例:
public class GzPrivate2 {
public static void main(String[] args) {
//宣告物件,不會報錯
Singleton s = null;
//例項化物件,呼叫了私有化的構造方法,程式報錯
s = new Singleton();//錯誤,無法例項化物件
}
}
class Singleton{
private Singleton(){
//將構造方法進行了封裝,私有化,這時候此構造方法只能在本類中可見!
}
public void prit(){
System.out.println("nishuibaichuan");
}
}
以上程式執行報錯!因為此類Singleton中的構造方法被私有化了,只能在本類Singleton中可見,不能再外部直接例項化!
既然再外部不可用,那麼我們就在內部使用!
舉例:
public class GzPrivate {
public static void main(String[] args) {
//宣告物件,不會報錯
Singleton1 s = null;
}
}
class Singleton1{
//在內部產生本類的例項化物件
Singleton1 singleton1 = new Singleton1();
private Singleton1(){
//將構造方法進行了封裝,私有化,這時候此構造方法只能在本類中可見!
}
public void prit(){
System.out.println("nishuibaichuan");
}
}
由上程式碼可知,當構造方法在其類中被私有化,那麼就只能在其本類內部中例項化物件了!
2.把在內部例項化的物件拿到外部類,這樣外部就可以直接通過此物件例項化了。正常情況下,在1中可以知道 singleton1屬性只能通過Singleton類的例項化物件才能呼叫,如果在沒有例項化物件的時候依然可以取得singleton1物件,則就需要singleton1宣告為static訪問型別,因為它不僅讓所有物件共享,更重要的是它可以直接通過使用類名稱進行訪問!
舉例:
public class GzPrivate4 {
public static void main(String[] args) {
Singleton3 s1 = null;//宣告物件
s1 = Singleton3.getSingleton3();//用類名稱.物件名,來給s1賦值
s1.fun();
}
}
class Singleton3{
//例項化s靜態物件
private static Singleton3 s = new Singleton3();
public static Singleton3 getSingleton3(){
return s;
}
private Singleton3(){
System.out.println("NISHUIBAICHUAN");
}
public void fun(){
System.out.println("nishuibaichuan");
}
}
執行結果:
NISHUIBAICHUAN
nishuibaichuan
構造方法私有化之後,就可以通過以上的形式取得例項化物件。
程式的意義:先看如下程式碼
public class GzPrivate4 {
public static void main(String[] args) {
Singleton3 s1 = null;//宣告物件
Singleton3 s2 = null;//宣告物件
Singleton3 s3 = null;//宣告物件
s1 = Singleton3.getSingleton3();//用類名稱.物件名,來給s1賦值
s2 = Singleton3.getSingleton3();//用類名稱.物件名,來給s2賦值
s3 = Singleton3.getSingleton3();
s1.fun();
s2.fun();
s3.fun();
}
}
class Singleton3{
//例項化s靜態物件
private static Singleton3 s = new Singleton3();
public static Singleton3 getSingleton3(){
return s;
}
private Singleton3(){
System.out.println("NISHUIBAICHUAN");
}
public void fun(){
System.out.println("nishuibaichuan");
}
}
執行結果:
NISHUIBAICHUAN
nishuibaichuan
nishuibaichuan
nishuibaichuan
由上程式碼可知:不管外部聲明瞭多少個Singleton4的物件,但是最終結果都是通過getSingleton4()方法取得的例項化物件,也就是說,此時的s1,s2,s3實際上都使用了一個物件的引用:s;因為他說static型別,為所有物件所共享的!
那麼以上的設計模式是屬於單態設計模式(單例設計模式):Singleton4
如果現在不希望一個類產生過多的物件的話,則就必須使用單態設計模式,而且使用
單態設計模式在以後的java學習中會經常遇到,因為在java的支援類庫中,大量的採用了此種設計模式。
所謂的單態就是在入口處(構造方法)限制了物件的例項化操作。
總結:單態設計模式的核心就是將類中的構造方法私有化,之後在類的內部產生例項化物件,並可通過該類的靜態方法返回例項化物件的引用。