工具類不應(yīng)該有公有的構(gòu)造函數(shù)

java 項目中使用的工具類非常多,比如JDK自己的工具java.lang.Math 、java.util.Collections 等都是我們經(jīng)常用到的工具類。工具類的屬性和方法都是靜態(tài)的,不需要生成實例即可訪問,而且JDK也做了很好的處理,由于不希望被初始化,于是設(shè)置了構(gòu)造函數(shù)為private的權(quán)限,表示除了此類本身外,誰都不能產(chǎn)生一個實例。

java.lang.Math的部分代碼
public final class Math {
    /**
     * Don't let anyone instantiate this class.
     */
    private Math() {}
}

Math的構(gòu)造函數(shù)設(shè)置成了private了:我就是一個工具類,我只想其它類通過類名來訪問,我不想通實例對象訪問。這在平臺型和框架型項目中已經(jīng)足夠了。但是已經(jīng)告訴你不能這么做了,你還是要實例Math類來訪問屬性和靜態(tài)方法(java反射是如此的發(fā)達(dá),修改一個構(gòu)造函數(shù)的訪問權(quán)限易如反掌),這樣就確保不了正確性了,隱藏的問題隨時都可能爆發(fā)!那我們在項目開發(fā)中有沒有更好的限制辦法呢?有,不僅僅設(shè)置成private訪問權(quán)限,還要拋異常,代碼實例如下:

public class LdapUtils {
    private LdapUtils() {
            throw new Error("請不要實例化我!");
    }
}

這樣做才能確保工具類才能不會被實例化,并且保證所有訪問都是通過類名來進(jìn)行的。需要注意的是,此工具類不能做繼承的打算,因為如果子類可以實例化的話,那就要調(diào)用父類的構(gòu)造函數(shù),可以父類沒有被訪問的構(gòu)造函數(shù),于是問題自然而然就出現(xiàn)了。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,623評論 18 399
  • 一、Java 簡介 Java是由Sun Microsystems公司于1995年5月推出的Java面向?qū)ο蟪绦蛟O(shè)計...
    子非魚_t_閱讀 4,538評論 1 44
  • 今天下午見了我的畢設(shè)導(dǎo)師,匯報了一下我的畢設(shè)進(jìn)展。導(dǎo)師說后期著重于校園建筑的模型建立和基礎(chǔ)設(shè)施的添加,之后再添加幾...
    不會飛的章魚閱讀 203評論 0 0
  • 在朋友圈里看到一句話:不做輸出的閱讀只是打發(fā)時間,沒有意義。 現(xiàn)在非常認(rèn)同這一點。 以前看書的時候喜歡看完一本就開...
    我就是卷貓閱讀 311評論 1 1
  • 小時候總有很多夢想,在學(xué)??粗蠋熓裁炊级€可以讓學(xué)生寫作業(yè)就想這以后我也一定要做一個老師哪樣我就可以讓我的學(xué)生寫...
    南山老太閱讀 239評論 2 2

友情鏈接更多精彩內(nèi)容