2009-02-10 26 views
19

我在想Java中的構造函數應該放多少代碼?我的意思是,你經常使用助手方法,在構造函數中調用它,但是有時會有一些更長的初始化事件,例如對於從文件,用戶界面或其他程序中讀取的程序只初始化實例變量,其中構造函數可能會變得更長(如果您不使用幫助器方法)。我有一些想法,建設者應該一般簡短,不應該嗎?這有沒有例外?應該在構造函數中放入多少代碼?

+0

試試這篇文章,應該回答你的問題:http://www.yegor256.com/2015/05/07/ctors-must-be-code-free.html – yegor256 2015-05-08 00:34:57

回答

10

如果你遵循SOLID原則,每個班級都應該有一個改變的理由(即做一件事)。因此,構造函數通常不會讀取文件,但是您將有一個單獨的類來構建文件中的對象。

+0

謝謝,你剛纔幫我避免了破SRP! – 2009-03-25 20:21:48

2

儘可能少地完成對象的初始化。

如果您可以將構造函數的一部分(5行左右是我的指南)作爲一大塊邏輯或特定過程進行討論,最好將其分解爲單獨的方法以實現清晰性和組織目的。

但是對於他自己的。

1

構造函數應該是足夠長的時間,但不再=)

如果要定義多個重載的構造函數,不重複的代碼;相反,將功能整合到其中之一,以提高清晰度和便於維護。

+0

嘿,在構造函數中添加訪問器是一個好習慣嗎? – 2014-05-16 15:56:10

1

正如Knuth所說:「不成熟的優化是萬惡之源。」

你應該在consructor中放多少?你需要的一切。這是「熱切」的做法。當 - 只有當 - 性能成爲問題時,你是否考慮優化它(對「懶惰」或「過度渴望」的方法)。

+0

表現通常不是問題;維護是!我不確定避免過早優化意味着避免過早維護優化... – skiphoppy 2009-02-10 07:17:17

4

看看this SO question。儘管另一個用於C++,但這些概念仍然非常相似。

1

構造函數應該創建對象的最小的通用實例。通用性如何?選擇從類繼承的每個實例或對象都必須通過的測試用例 - 即使「有效」僅意味着優雅地失敗(以編程方式生成的異常)。

維基百科有一個很好的說明:

http://en.wikipedia.org/wiki/Constructor_(computer_science)

有效的對象是構造的目標,有效的不一定是有用的 - 可以在一個初始化的方法來進行。

0

我慣常的做法是,如果所有的構造函數都要在對象上設置一些字段,它可以是任意長的。如果時間太長,這意味着無論如何這個類的設計都會被破壞,或者數據需要被包裝在一些更復雜的結構中。

另一方面,如果輸入數據在初始化類字段之前需要更復雜的處理,我傾向於給構造函數處理過的數據並將處理移至靜態工廠方法。

0

在您完成任何有用的工作之前,您的課程可能需要初始化爲特定狀態。

請考慮這一點。

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. 調用助手函數。

確保類的行爲正確,當它的成員稍後被調用時,就是所有需要完成的事情。

0

構造就像是一個應用程序安裝嚮導,你能做的只有配置。如果實例準備採取任何(可能)動作本身,然後構造函數做得很好。

相關問題