簡體   English   中英

它是強制性的實用程序類,應該是最終的私有構造函數嗎?

[英]Is it mandatory utility class should be final and private constructor?

通過使用私有構造函數,我們可以避免在外部的任何地方實例化類。 通過將班級定為最終班級,其他任何班級都無法對其進行擴展。 為什么Util類必須具有private構造函數和final類?

從功能的角度或Java復雜性或運行時來看,這不是強制性的。 但是,其編碼標准已為更廣泛的社區所接受。 甚至很多靜態代碼查看工具(如checkstyle)和許多其他工具都檢查此類遵循了這種約定。

為什么遵循該約定,已經在其他答案中進行了解釋,甚至OP都對此進行了說明。

我想進一步解釋一下,大多數Utility類具有與對象實例無關的方法/函數。 這些是聚合函數,因為它們僅依賴於返回值的參數,而不與實用程序類的類變量相關聯。 因此,大多數這些功能/方法保持靜態。 因此,實用程序類最好是所有靜態方法的類。 因此,任何調用這些方法的程序員都無需實例化此類。 但是,某些自動編碼器(可能經驗不足或興趣不足)會傾向於創建對象,因為他們認為在調用其方法之前需要這樣做。 為了避免創建該對象,我們有3種選擇:-

  1. 繼續教育人們不要實例化它 (沒有理智的人可以繼續這樣做。)
  2. 將類標記為抽象:-現在,自動編碼器將不再創建對象。 但是,評論家和更廣泛的Java社區將爭辯說,標記抽象意味着您希望有人對其進行擴展。 因此,這也不是一個好選擇。
  3. 私有構造函數:-受保護將再次允許子類創建對象。

現在,如果有人想為這些實用程序類添加用於某些功能的新方法,則無需擴展它,可以添加新方法,因為每種方法都是獨立的,並且沒有破壞其他功能的機會。 因此,無需覆蓋它。 而且您也不會實例化,因此需要對其進行子類化。 最好將其標記為最終。

總之,創建實用程序類的對象沒有任何意義。 因此,構造函數應該是私有的。 而且您永遠都不想覆蓋它,因此將其標記為最終的。

沒必要,但是很方便。 實用程序類只是相關功能的名稱空間持有者,並不意味着要實例化或子類化。 因此,防止實例化和擴展會向該類的用戶發送正確的消息。

Java語言和Java運行時之間有一個重要的區別。

將java類編譯為字節碼時,沒有訪問限制的概念, publicpackageprotectedprivate等效。 總是可以通過反射或字節碼操作來調用private構造函數,因此jvm無法依賴該功能。

另一方面, final是一直存在到字節碼中的東西,它提供的保證可以被javac用來生成更有效的字節碼,而jvm可以用來生成更有效的機器指令。

啟用的大多數優化不再相關,因為jvm現在將相同的優化應用於在運行時是單態的所有類,而這些優化始終是最重要的。

默認情況下,此類通常用於聚合執行不同操作的函數,在這種情況下,我們無需創建新對象

暫無
暫無

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

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