显式无参数构造函数与默认构造函数
大多數不熟悉Java的開發人員在沒有指定至少一個顯式構造函數的情況下 ,會很快了解到為其Java類隱式創建了“ 默認構造函數 ”( 由javac )。 Java語言規范的 8.8.9節簡要指出:“如果一個類不包含構造函數聲明,則將隱式聲明一個默認構造函數。” 該部分進一步描述了隱式創建的默認構造函數的特征,包括它不帶參數,不帶throws子句,以及調用類似地不接受任何參數的其超類的構造器。 Java開發人員可以選擇顯式實現類似于默認構造函數的無參數構造函數(例如,不接受任何參數且不包含throws子句)。 在本文中,我探討了一些開發人員可能決定實現顯式無參數構造函數而不是依賴于隱式默認構造函數的原因 。
明確指定無參數構造函數的一些原因
排除類的實例化
實施顯式無參數構造函數的常見原因是,避免使用public可訪問性隱式創建默認構造函數。 如果類具有其他顯式構造函數(接受參數),則這是不必要的步驟,因為任何顯式構造函數的存在都會阻止隱式默認構造函數的生成。 但是,如果不存在其他顯式構造函數(例如,在具有所有static方法的“實用程序”類中),則可以通過實現具有private訪問權限的顯式無參數構造函數來排除隱式默認構造函數。 Java語言規范的 8.8.10節描述了使用所有private顯式構造函數來防止類的實例化。
通過Builder或靜態初始化工廠強制類實例化
顯式實現private無參數構造函數的另一個原因是,通過靜態初始化工廠方法或構造器而不是構造函數來強制實例化該類的對象。 Effective Java (第三版)的前兩項概述了使用靜態初始化工廠方法和生成器比直接使用構造器的優勢。
需要多個構造函數,包括無參數構造函數
實現無參數構造函數的一個明顯原因可能是與上面討論的原因一樣普遍或更常見,這是當需要無參數構造函數時,但需要參數的構造函數也是如此。 在這種情況下,由于存在其他期望參數的構造函數,因此必須顯式創建無參數構造函數,因為永遠不會為已經具有一個或多個顯式構造函數的類隱式創建默認構造函數。
使用Javadoc構建文檔對象
顯式實現無參數構造函數而不是依賴隱式創建的默認構造函數的另一個原因是在構造函數上表達Javadoc注釋。 這是JDK-8224174 (“ java.lang.Number具有默認構造函數”)的既定理由,該理由現在是JDK 13的一部分,并且也以當前未解決的JDK-8071961表示 (“當默認構造函數為已創建”)。 最近編寫的CSR JDK-8224232 (“ java.lang.Number具有默認構造函數”)詳細說明了這一點:“默認構造函數不適用于有據可查的API。”
顯性優先于隱性優先
與隱式創建相比,某些開發人員通常更喜歡顯式規范。 在Java中,可以在顯式規范或隱式對應之間進行選擇。 如果開發人員重視溝通方面或假定顯式構造函數具有更高的可讀性,則他們可能更喜歡顯式無參數構造函數而不是隱式構造函數。
在JDK中用顯式無參數構造函數替換默認構造函數
在JDK中,有些情況下,隱式默認構造函數已被顯式無參數構造函數代替。 其中包括:
- JDK 9中已解決的JDK-8071959 (“ java.lang.Object使用隱式默認構造函數”)用顯式的無參數構造函數代替了java.lang.Object的“默認構造函數”。 閱讀該問題的“描述”使我微笑:“在修改java.lang.Object( JDK-8071434 )上的某些文檔時,注意到該類*沒有*具有顯式構造函數,而是依靠javac創建隱式默認構造函數。 多么尷尬!”
- JDK 9中已解決的JDK-8177153 (“ LambdaMetafactory具有默認構造函數”)用顯式(和private )無參數構造函數代替了隱式默認構造函數。
- JDK 13計劃的JDK-8224174 (“ java.lang.Number具有默認構造函數”)將用顯式無參數構造函數替換java.lang.Number的隱式默認構造函數。
關于默認構造函數的潛在javac lint警告
有一天, javac可能會收到可用的lint警告,以指出具有默認構造函數的類。 JDK-8071961 (“當創建默認構造函數時添加javac lint警告”)目前尚不適用于任何特定的JDK版本,它指出:“ JLS第8.8.9節記錄了,如果一個類沒有聲明至少一個構造函數,編譯器默認會生成一個構造函數。 盡管此策略可能很方便,但是對于正式類,如果沒有其他原因導致默認構造函數沒有Javadoc,則這是一種不良的編程習慣。 使用默認構造函數可能是合理的javac lint警告。”
結論
依賴于在編譯時創建的默認構造函數絕對很方便,但是在某些情況下,即使不需要顯式指定,顯式指定無參數構造函數也可能更為可取。
翻譯自: https://www.javacodegeeks.com/2019/05/explicit-arguments-constructor-versus-default-constructor.html
總結
以上是生活随笔為你收集整理的显式无参数构造函数与默认构造函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 方法注解_使用Java注解不正
- 下一篇: java中runnable_Java:在