簡體   English   中英

有效的Java Item1-用於創建對象的靜態工廠方法

[英]Effective Java Item1 - Static factory method for object creation

我正在研究有效的Java項目1,其中討論了用於對象創建的“靜態工廠方法與構造函數”。 提到的缺點之一如下:

“僅提供靜態工廠方法的主要缺點是沒有公共或受保護的構造函數的類不能被子類化。”

還提到這是很好的,因為它將促進對象組成的繼承。 但是,當您確實想要繼承時,這不是一個嚴重的限制嗎? 當我從以前不知道是否要擴展該類時,為什么我應該選擇靜態工廠方法來創建對象?

當我從以前不知道是否要擴展該類時,為什么我應該選擇靜態工廠方法來創建對象?

這個問題的答案在有效的Java項目17: 繼承的設計和文檔或禁止繼承中 設計用於繼承的類需要大量的工作,包括以下內容。

  1. 精確記錄覆蓋任何方法的效果。
  2. 提供掛鈎方法。
  3. 測試子類(通過自己實現這些類)。
  4. 限制構造函數以避免所有可重寫的方法。
  5. 考慮CloneableSerializable接口及其對繼承的影響。

如果您完成了所有這些工作,那么您將不會提供靜態工廠方法。 您還將提供至少一個公共或受保護的構造函數。

有效的Java在上述各點上都有詳細說明,但最終建議是,

解決此問題的最佳方法是禁止在未設計和記錄為可安全子類化的類中進行子類化。

引用是:

僅提供靜態工廠方法的主要缺點是沒有公共或受保護的構造函數的類不能被子類化。

感覺不是與靜態工廠有關,而是僅提供靜態工廠方法

您必須為擴展而設計,而不是為“嗯,也許我現在不太確定,但為了以防萬一,我會保留它的可擴展性”。

如果您的類是可擴展的,則至少需要一個公共構造函數。 在這種情況下,你只能提供靜態工廠方法。 但我不會稱其為嚴重限制。

暫無
暫無

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

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