2017-08-19 59 views
2

爲什麼我們使用這種形式? (這是一個關於Java的複數視域)構造子鏈

public MathEquation(char opCode) 
    { 
     this.opCode = opCode; 
    } 

public MathEquation(char opCode , double leftVal , double rightVal) 
    { 
     this(opCode); 
     this.leftVal = leftVal; 
     this.rightVal = rightVal; 
    } 

爲什麼不是這個?

public MathEquation(char opCode , double leftVal , double rightVal) 
    { 
     this.opCode = opCode 
     this.leftVal = leftVal; 
     this.rightVal = rightVal;  
    } 
+1

因爲根據可用的參數,類可以以兩種不同的方式構建? – Li357

+0

並明確說明有兩種「通常」的方式來構造它。 –

回答

7

因爲如果由於某種原因,你需要做更多的東西與操作碼(如把它收藏起來之前爲大寫,或檢查它在一定範圍內,或者類似的東西),你不會必須在兩個構造函數中重複該代碼。一個人只會調用已經寫在另一箇中的代碼。

這個一般原則被稱爲幹:不要重複自己。

注意,它經常被在另外一個方向:最簡單的構造函數調用中最複雜的一個,指定什麼樣的默認值以通爲缺少參數:

public MathEquation(char opCode) { 
    this(opCode, 0.0, 0.0); 
} 
+0

所以我可以只寫第二個構造函數以避免重複,但我們使用這種形式的鏈接允許我們...將opCode更改爲「OpCode」? 以及你是什麼意思的範圍(對於編程來說很抱歉:D) – ShaDiliX

+0

不。假設作爲參數傳遞的opCode是「p」,並且實際上你想將它存儲爲「P」(即將它轉換爲大寫存儲它)。或者假設調用者只能傳遞「a」和「z」之間的值(即在一些值範圍內),構造函數需要檢查該值是否確實在該值範圍內。 –

+0

明白了(y)sry can not vote xD – ShaDiliX

2

的一點是:你希望儘量減少的數量不同工作構造函數。

從這個角度來看,最佳解決方案是一個arg構造函數調用3 arg構造函數(使其明確哪些默認值應該用於其他兩個參數)!當你這樣做時,只有一個構造函數會做某些事情 - 而在你的例子中,3參數構造函數做了一些調用另一個構造函數。

含義:在問題中使用的任何形式都不是理想的。

+0

好嗎什麼是理想形式? (注意:上面用於構造函數鏈接的構造函數) – ShaDiliX

+0

@ShaDiliX答案就在你面前,在答案的6行中:*最佳解決方案是,一個arg構造函數調用3參數構造函數*。仔細讀。 –

+0

但他說這個問題中使用的兩種形式都不是理想的......這就是爲什麼我問 – ShaDiliX

1

爲了符合

的S - 單責任原則
Ø - 開放 - 封閉原則

下面的構造器負責只需一次人操作,如果在未來要擴展的功能,你可以輕鬆做到這一點。

public MathEquation(char opCode) 
{ 
    this.opCode = opCode; 
    //new functionality 
}