2011-10-18 65 views
1

變量可以在任何一個解釋初始化構造函數中的實例變量的優勢,對象之後,我們可以做同樣的事情已經建成,並調用相應的setter方法方法。效益初始化內部構造

+5

不可變對象 – Joe

回答

1

如果你依賴於外部代碼來初始化成員變量,而在邏輯上與使用構造函數時,你缺少OO設計的整個點你的程序可能是正確的。

您作爲開發商OO目標是要打破你的代碼,似乎外面的黑盒子自包含的類。外部代碼不應該知道內部是什麼類型的成員變量。外部代碼唯一需要依賴於你的類的公共接口。如果你遵循SOLID原則,你應該確保你的類也暴露了MINIMAL數量的函數。這樣,您可以爲消費者提供乾淨的抽象接口,而代碼內部可以像您希望的那樣複雜。

你甚至可以去到一個地步,你會決定你的類是這麼大,你希望把它分成多類,並讓整個設計流程更好地重新排列數據/功能。如果您有直接操縱數據成員的外部代碼,現在正在成像。

1

是的,你可以通過制定者做同樣的事情,但你的類將是不一致的,直到你設置了所有必需的變量,而且任何一個都可以設置器調用後改變的變量,如果二傳手暴露(這可能是要求,但你可以在setter中添加檢查)
在構造函數中使用變量的優點是可以保證僅使用有效值創建對象。
你可以考慮靜態工廠,而不是構造函數 - 讀Item 2 - Creating and Destroying Objects from effective java.

0

天真的setter/getter方法真的是面向對象編程的腐敗。 oo有什麼意義?要創建能夠管理課程內容的複雜性的類,而不需要課外的代碼,不必知道課程是如何工作的。

通過添加的getter/setter方法你基本上暴露類如何工作,而無需實際暴露成員變量,這是不是真的這樣的好事。

無論如何,我們總是這樣做,爲了方便,但它真的不是最好的主意。

請考慮以下事項,您想對Car進行建模,並且想知道何時需要換油。假設您添加方法

Date getLastOilChangeDate() 
void setLastOilChangeDate(Date changeDate) 
int getMileageAtLastOilChange() 
void setMileageAtLastOilChange(int mileage) 

基本上使用成員變量的值。

看起來好吧?但它確實不好。您正在揭露汽車如何確定是否需要對外部世界進行石油更換,何時汽車無法確定這些信息,這與世界上的業務無關。爲什麼?

也許一輛汽車在2015年問世,這種方式並不奏效。也許它有一個油骯髒的傳感器,可以持續監測油的狀態,並且當你需要更換油時,它可以作爲基礎。

現在上述兩種方法根本沒有價值。

如果你已經不是加了

boolean needsOilChange() 

方法,該類的接口就不必連壽變化,實現做到了。