1. 程式人生 > >java中構造方法私有化

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的支援類庫中,大量的採用了此種設計模式。

所謂的單態就是在入口處(構造方法)限制了物件的例項化操作。

總結:單態設計模式的核心就是將類中的構造方法私有化,之後在類的內部產生例項化物件,並可通過該類的靜態方法返回例項化物件的引用。