簡體   English   中英

Java - 沒有類構造函數是不好的做法嗎?

[英]Java - is it bad practice not to have a class constructor?

我想創建一個處理格式的輔助類(即具有刪除標點符號和類型之間轉換的方法,以及重新格式化名稱等)。 這似乎不需要任何字段 - 它的唯一目的是讓傳遞的東西轉換並返回它們,重新格式化。 省略構造函數是不好的做法嗎? 如果是這樣,我的構造函數應該做什么? 我正在查看此鏈接,並注意到它描述的類缺少構造函數。

省略構造函數是不好的做法嗎?

是的 - 因為除非您指定任何構造函數,否則 Java 編譯器將為您提供與類本身具有相同可見性的構造函數。

假設你所有的方法都是靜態的——這似乎很可能,除非你想要多態——你應該讓你的類final並給它一個private構造函數,這樣其他開發人員就不會意外地創建你的類的實例,而那將毫無意義。 在考慮 API 時,只要我可以消除開發人員做一些愚蠢的事情的能力,我就會這樣做 :)

所以像:

public final class Helpers {
    private Helpers() {
    }

    public static String formatDate(Date date) {
        // etc
    }
}

請注意,通過將多態性排除在等式之外,您還消除了為測試等改變這種行為的可能性。這可能很好——我不相信“永遠沒有靜態”——但值得考慮。

任何擁有所有沒有或不需要任何狀態的方法的類都可以通過將構造函數設為私有來自由地降低構造函數的可見性。

Java 中的示例java.lang.Math類。

由於java.lang.Math具有所有與您的類執行類似工作的靜態方法,因此它們已將構造函數聲明為private ,因此沒有人可以意外創建該類的實例。

    /**
     * Don't let anyone instantiate this class.
     */
    private Math() {}

不錯的做法。 但是您給出的示例沒有任何可以在 Object 上下文中使用的成員變量。 在這種情況下,最好使用靜態方法,因為這樣您就不需要在調用方法之前分配內存來為類創建對象。

編譯器將為您生成一個默認構造函數(不帶參數)。 如果你的類沒有狀態並且沒有擴展一個需要初始化的類,你可以讓它在不聲明顯式構造函數的情況下

省略構造函數是不好的,因為您的類中沒有任何實例變量!

構造函數用於初始化實例變量!

仍然如果你跳過構造函數,編譯器無論如何都會插入默認構造函數,這很公平!

您不必為您的類提供任何構造函數,但這樣做時必須小心。 編譯器會自動為任何沒有構造函數的類提供無參數的默認構造函數。 此默認構造函數將調用超類的無參數構造函數。 在這種情況下,如果超類沒有無參數構造函數,編譯器會報錯,因此您必須驗證它是否存在。 如果你的類沒有顯式的超類,那么它有一個 Object 的隱式超類,它確實有一個無參數的構造函數。

Java 官方文檔:為你的類提供構造函數

通常在類中定義構造函數是一種很好的編碼習慣,盡管每個類都有一個默認構造函數。

但是,如果您沒有任何特殊需要使用重載構造函數或制作任何單例模式,那么您可以刪除構造函數。

如果您在您的情況下使用靜態方法,那么您也不需要定義構造函數,因為您不需要擁有此類的對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM