變量可以在任何一個解釋初始化構造函數中的實例變量的優勢,對象之後,我們可以做同樣的事情已經建成,並調用相應的setter方法方法。效益初始化內部構造
回答
如果你依賴於外部代碼來初始化成員變量,而在邏輯上與使用構造函數時,你缺少OO設計的整個點你的程序可能是正確的。
您作爲開發商OO目標是要打破你的代碼,似乎外面的黑盒子自包含的類。外部代碼不應該知道內部是什麼類型的成員變量。外部代碼唯一需要依賴於你的類的公共接口。如果你遵循SOLID原則,你應該確保你的類也暴露了MINIMAL數量的函數。這樣,您可以爲消費者提供乾淨的抽象接口,而代碼內部可以像您希望的那樣複雜。
你甚至可以去到一個地步,你會決定你的類是這麼大,你希望把它分成多類,並讓整個設計流程更好地重新排列數據/功能。如果您有直接操縱數據成員的外部代碼,現在正在成像。
是的,你可以通過制定者做同樣的事情,但你的類將是不一致的,直到你設置了所有必需的變量,而且任何一個都可以設置器調用後改變的變量,如果二傳手暴露(這可能是要求,但你可以在setter中添加檢查)
在構造函數中使用變量的優點是可以保證僅使用有效值創建對象。
你可以考慮靜態工廠,而不是構造函數 - 讀Item 2 - Creating and Destroying Objects from effective java.
天真的setter/getter方法真的是面向對象編程的腐敗。 oo有什麼意義?要創建能夠管理課程內容的複雜性的類,而不需要課外的代碼,不必知道課程是如何工作的。
通過添加的getter/setter方法你基本上暴露類如何工作,而無需實際暴露成員變量,這是不是真的這樣的好事。
無論如何,我們總是這樣做,爲了方便,但它真的不是最好的主意。
請考慮以下事項,您想對Car進行建模,並且想知道何時需要換油。假設您添加方法
Date getLastOilChangeDate()
void setLastOilChangeDate(Date changeDate)
int getMileageAtLastOilChange()
void setMileageAtLastOilChange(int mileage)
基本上使用成員變量的值。
看起來好吧?但它確實不好。您正在揭露汽車如何確定是否需要對外部世界進行石油更換,何時汽車無法確定這些信息,這與世界上的業務無關。爲什麼?
也許一輛汽車在2015年問世,這種方式並不奏效。也許它有一個油骯髒的傳感器,可以持續監測油的狀態,並且當你需要更換油時,它可以作爲基礎。
現在上述兩種方法根本沒有價值。
如果你已經不是加了
boolean needsOilChange()
方法,該類的接口就不必連壽變化,實現做到了。
- 1. Java:在構造函數內部或外部初始化對象?
- 2. 構造函數內部或外部的成員初始化
- 3. 初始化在構造
- 4. C++中初始化構造
- 5. C++構造初始化
- 6. 是什麼,如果初始化VS內部構造
- 7. 初始化塊vs構造函數vs變量初始化
- 8. 構造函數初始化vs獲取集合初始化
- 9. 初始化的聲明VS在構造函數初始化
- 10. 帶空初始化的構造函數初始化列表
- 11. 初始化在定義與初始化在構造函數中
- 12. 我是否應該在類構造函數內部或外部初始化shared_ptr?
- 13. 內部類和初始化
- 14. 構造和初始化數組
- 15. 構造鏈接和初始化語法
- 16. 在構造函數中初始化
- 17. Java構造函數初始化?
- 18. C結構數組初始化鑄造
- 19. 初始化構造函數C++
- 20. 創建構造函數初始化
- 21. C++模板構造函數初始化
- 22. 構造函數中的初始化塊
- 23. 構造函數初始化混淆
- 24. 類的構造函數初始化?
- 25. c#構造函數與初始化
- 26. Java構造器異議初始化
- 27. 長構造函數初始化列表
- 28. SystemC的構造器初始化失敗
- 29. 缺少構造函數初始化
- 30. 調用構造函數並初始化
不可變對象 – Joe