2013-04-28 123 views
1

我希望這不是一個愚蠢的問題。
具有3個基本構造基本構造函數鏈調用

public MyClass(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
    // TODO Auto-generated constructor stub 
} 

public MyClass(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    // TODO Auto-generated constructor stub 
} 

public MyClass(Context context) { 
    super(context); 
    // TODO Auto-generated constructor stub 
} 

每個首先調用super類的構造函數。所以,它的意思是所有常見的構造函數代碼,我必須把這樣的私有方法?:

public MyClass(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
    common(context); 
} 

public MyClass(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    common(context); 
} 

public MyClass(Context context) { 
    super(context); 
    common(context); 
} 

private void common(Context context) { ... } 

不過,我覺得我可以鏈通用代碼構造,但我得到一個錯誤說構造函數調用必須代碼中的第一條語句。

public MyClass(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
    this(context, attrs); 
} 

public MyClass(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    // Some code 
    this(context); 
} 

public MyClass(Context context) { 
    super(context); 
    // Some more code 
} 

而第一個語句是超級構造函數調用或類構造函數調用,不能同時存在。

Constructor call must be the first statement in a constructor 
+1

您可以使用'this'來鏈接構造函數,並將初始化代碼鏈接到最後一個構造函數中。 – Luksprog 2013-04-28 14:47:35

回答

6

最好的辦法是使用這個() - 你並不需要創建一個新的方法,你尊重了DRY原則(不要重複自己)

public MyClass(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     // your code here 
    } 

    public MyClass(Context context, AttributeSet attrs) { 
     // Assuming 0 is the default value of defStyle, else pass the default value 
     this(context, attrs, 0); 
    } 

    public MyClass(Context context) { 
     // Assuming null is the default value for attrs 
     this(context, null); 
    } 
+0

爲什麼這是最好的方式? – 2013-04-28 14:52:37

+0

@LewsTherin這是因爲,最好的辦法()對於由該;-)您不必再創建一個方法,你尊重了DRY原則,很容易。 – Thierry 2013-04-28 14:54:04

+0

假如把它放在你的答案的話..假設OP不知道:) – 2013-04-28 14:54:46

3

你不不必創建另一種方法,您尊重DRY原則,這很容易。

public MyClass(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     // your code here 
    } 
    public MyClass(Context context, AttributeSet attrs) { 
     this(context, attrs,null); 
    } 
    public MyClass(Context context) { 
     this(context,null,null); 
    } 

可以以這種方式使用

+0

代碼..但沒有解釋爲什麼它更好? – 2013-04-28 14:52:18

+0

我同意不管Thierry給出的答案 – PSR 2013-04-28 14:55:13

0

我所說的其實是把常見的代碼最參數化的構造,並呼籲從所有其他(少參數化)構造函數的構造,當然是有一些默認值現在缺少的參數(你可以用一個this(...)聲明鏈同一個類的構造函數)。如果你延長了超設計得當,你應該能夠使用你最參數化的構造函數通過鏈接(用super(...)語句)調用它的最參數化的構造函數。

如果不適合你的情況下工作,那麼一個私有方法是一種非常精細的方式來解決這個問題,通常有在試圖解決它更沒有好處。

0

那麼,把通用代碼放在一個構造函數中,並確保從其他所有構造函數中調用它,注意最後一個參數int defStyle,我假定0是defStyle的默認值。

public MyClass(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
    common(context); 
} 

public MyClass(Context context, AttributeSet attrs) { 
    this(context, attrs,0); 
} 

public MyClass(Context context) { 
    this(context,null,0); 
} 

private void common(Context context) { ... }