Java私有構造器


Java私有構造器:使用private關鍵字聲明的構造函數。由於類的構造函數時私有的,所以此類不能被實例化,同時也不能被繼承。《Effective Java》第三條:用私有構造器或者枚舉強化Singleton屬性。所謂Singleton屬性是指僅僅被實例化一次的類。第四條:通過私有構造器強化不可實例化的能力。在Java中實現Singleton有兩種方式:

public class Elvis {
	public static final Elvis INSTANCE = new Elvis();
	private Elvis() {}
}

public class Elvis {
	private static final Elvis INSTANCE = new Elvis();
	private Elvis() {}
	public static Elvis getInstance() { return INSTANCE;}
}

方法一:私有構造函數只能被調用一次,用來實例化公有的靜態final域Elvis.INSTANCE,一旦Elvis被實例化,只會存在一個Elvis實例(享有特權的客戶端可以借助AccessibleObject.setAccessible方法通過反射機制調用私有構造器);

方法二:使用靜態方法getInstance返回對同一個對象的引用,永遠不會創建其他Evlis實例;

為什么需要私有構造器,如果類不能被實例化該怎么使用這個類的方法?

私有構造器的存在可以讓某些類不能被實例化和子類化,這些類通常是一些工具類,例如java.lang.Math等,訪問這些類的方法我們可以定義公有的靜態方法來實現,如A.methon()

public class A {
    private A() {}
    public static void methon() {}              
}

java.lang.Math中私有構造器的使用,可以看到Math類被定義為final的,使用了private的構造函數,它的方法都是static的,所以調用其方法只需要Math.sin(x)即可:

public final class Math {
    private Math() {}
    public static final double E = 2.7182818284590452354;
    public static final double PI = 3.14159265358979323846;
    
    public static double sin(double a) {
        return StrictMath.sin(a); // default impl. delegates to StrictMath
    }
    
    public static double cos(double a) {
        return StrictMath.cos(a); // default impl. delegates to StrictMath
    }

    public static double tan(double a) {
        return StrictMath.tan(a); // default impl. delegates to StrictMath
    }

    ......

    public static float scalb(float f, int scaleFactor) {
        return sun.misc.FpUtils.scalb(f, scaleFactor);
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM