我在想Java中的構造函數應該放多少代碼?我的意思是,你經常使用助手方法,在構造函數中調用它,但是有時會有一些更長的初始化事件,例如對於從文件,用戶界面或其他程序中讀取的程序只初始化實例變量,其中構造函數可能會變得更長(如果您不使用幫助器方法)。我有一些想法,建設者應該一般簡短,不應該嗎?這有沒有例外?應該在構造函數中放入多少代碼?
回答
如果你遵循SOLID原則,每個班級都應該有一個改變的理由(即做一件事)。因此,構造函數通常不會讀取文件,但是您將有一個單獨的類來構建文件中的對象。
謝謝,你剛纔幫我避免了破SRP! – 2009-03-25 20:21:48
儘可能少地完成對象的初始化。
如果您可以將構造函數的一部分(5行左右是我的指南)作爲一大塊邏輯或特定過程進行討論,最好將其分解爲單獨的方法以實現清晰性和組織目的。
但是對於他自己的。
構造函數應該是足夠長的時間,但不再=)
如果要定義多個重載的構造函數,不重複的代碼;相反,將功能整合到其中之一,以提高清晰度和便於維護。
嘿,在構造函數中添加訪問器是一個好習慣嗎? – 2014-05-16 15:56:10
正如Knuth所說:「不成熟的優化是萬惡之源。」
你應該在consructor中放多少?你需要的一切。這是「熱切」的做法。當 - 只有當 - 性能成爲問題時,你是否考慮優化它(對「懶惰」或「過度渴望」的方法)。
表現通常不是問題;維護是!我不確定避免過早優化意味着避免過早維護優化... – skiphoppy 2009-02-10 07:17:17
看看this SO question。儘管另一個用於C++,但這些概念仍然非常相似。
構造函數應該創建對象的最小的通用實例。通用性如何?選擇從類繼承的每個實例或對象都必須通過的測試用例 - 即使「有效」僅意味着優雅地失敗(以編程方式生成的異常)。
維基百科有一個很好的說明:
http://en.wikipedia.org/wiki/Constructor_(computer_science)
有效的對象是構造的目標,有效的不一定是有用的 - 可以在一個初始化的方法來進行。
我慣常的做法是,如果所有的構造函數都要在對象上設置一些字段,它可以是任意長的。如果時間太長,這意味着無論如何這個類的設計都會被破壞,或者數據需要被包裝在一些更復雜的結構中。
另一方面,如果輸入數據在初始化類字段之前需要更復雜的處理,我傾向於給構造函數處理過的數據並將處理移至靜態工廠方法。
在您完成任何有用的工作之前,您的課程可能需要初始化爲特定狀態。
請考慮這一點。
public class CustomerRecord
{
private Date dateOfBirth;
public CustomerRecord()
{
dateOfBirth = new Date();
}
public int getYearOfBirth()
{
Calendar calendar = Calendar.getInstance();
calendar.setTime(dateOfBirth);
return calendar.get(Calendar.YEAR);
}
}
現在,如果你不初始化出生日期成員varialble,getYearOfBirth()的任何後續調用,將導致一個NullPointerException。
所以這可能涉及值的
- 分配最低限度的初始化。
- 調用助手函數。
確保類的行爲正確,當它的成員稍後被調用時,就是所有需要完成的事情。
構造就像是一個應用程序安裝嚮導,你能做的只有配置。如果實例準備採取任何(可能)動作本身,然後構造函數做得很好。
- 1. 構造函數應該完成多少工作?
- 2. 我班的構造函數應該完成多少工作?
- 3. 有多少構造函數太多?
- 4. 解釋該類別中的構造函數/析構函數調用++代碼
- 5. 構造函數被調用多少次?
- 6. 可測試代碼:在構造函數
- 7. 構造函數應該指定參數
- 8. 我應該在構造函數中調用成員函數
- 9. 統一:構造函數注入與多個構造函數
- 10. 我應該把這個JavaScript代碼放入函數嗎?
- 11. DialogPreference缺少構造函數
- 12. NHibernate和缺少的構造函數代碼
- 13. 類中的什麼代碼應該屬於構造函數,方法
- 14. 構造函數中的代碼是否添加到子類構造函數中的代碼中?
- 15. 多構造函數
- 16. Boa構造函數破壞代碼
- 17. 我的所有參數是否應該在構造函數中?
- 18. 什麼應該是構造函數屬性值..a原型構造函數或對象構造函數本身
- 19. Visual C#中的構造函數代碼的等效代碼
- 20. 你應該在MongoDB中嵌入多少?
- 21. 我應該在一個文件中放入多少個類?
- 22. 我應該在類或構造函數中放置變量嗎? PHP
- 23. 是否有可能將構造函數放在另一個構造函數的構造函數中?
- 24. 我應該如何編寫派生類構造函數的代碼?
- 25. 減少構造鍋爐板代碼
- 26. 我應該使用構造函數注入還是IoC.Resolve?
- 27. 註冊類到Ninject並在構造函數中注入該類
- 28. 代碼簽名應該放置在構建/發佈過程中?
- 29. 要在try-catch塊中放入多少代碼
- 30. 將構造函數作爲Scala中的函數處理 - 如何將構造函數放入地圖中?
試試這篇文章,應該回答你的問題:http://www.yegor256.com/2015/05/07/ctors-must-be-code-free.html – yegor256 2015-05-08 00:34:57