2016-09-09 19 views
-1

我看到我們可以用setter封裝實例變量,然而,構造函數似乎做同樣的事情。何時使用Setters以及何時使用Constructors來設置變量值?

Class object1 = new Class(100, 100) // setting using Constructor 

object1.setValue(100, 100) // setting using Setters 

什麼時候應該使用setter,何時應該使用構造函數來初始化實例變量值?

+0

還有一個類似的問題在這裏:http://stackoverflow.com/questions/7779509/setter-di-vs-constructor-di-in-spring –

+2

這是一個意見的問題;這裏是我的:儘可能使用構造函數來減少代碼,但我不建議通過setter設置多個值。 – ChiefTwoPencils

+0

一個可能的時間更傾向於另一個:[BeanShell](http://www.beanshell.org/)或任何其他期望[bean]的框架(https://en.wikipedia.org/wiki/JavaBeans )。 –

回答

3

時使用的值是需要的對象變得有意義,或者當你需要在一次一致性或便於提供多個值的構造函數;例如,長方形必須有具有長度和寬度。

Rectangle r = new Rectangle(10, 20); 

提供製定者當你有在創建對象之後,可以改變可選值(如顏色),或者值:

r.setColor(Color.BLUE); 

注意,這是通常優選以創建不可改變「值對象「只要有可能,因爲這些消除了幾種潛在的錯誤。值對象必須一次性全部初始化,但他們也經常有返回一個新的,類似的對象方法:

當你創建了一個對象的第一個實例
r = r.withLength(15); 
+0

謝謝Chrylis!那正是我期待的! – Togusa

0

構造函數中使用。 當您更改該對象的屬性時使用Setters。

+0

並非總是...... – ChiefTwoPencils

+0

使用構造函數創建對象不是最佳實踐嗎? –

0

讓我把它與現實生活scenerio。

我是XXX組織的開發者,使用YYY品牌的電腦。

在Java中,這對應於4個類,類YYY,類XXX,類Developer,類Computer。

  • 由於YYY公司生產計算機 - 所以YYY級別的計算機必須具有構造函數。
  • 由於組織XXX爲我配置計算機供我使用,所以類XXX必須有類計算機(不是構造函數)的setter。例如setOS(),setJava()
  • 因爲我使用那臺計算機,所以類Developer將具有getter方法,既不是setter也不是構造函數。

我希望這會幫助你。

相關問題