基本构造函数链调用

问题描述:

我希望这不是一个愚蠢的问题。
具有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

最好的办法是使用这个() - 你并不需要创建一个新的方法,你尊重了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

你不不必创建另一种方法,您尊重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

我所说的其实是把常见的代码最参数化的构造,并呼吁从所有其他(少参数化)构造函数的构造,当然是有一些默认值现在缺少的参数(你可以用一个this(...)声明链同一个类的构造函数)。如果你延长了超设计得当,你应该能够使用你最参数化的构造函数通过链接(用super(...)语句)调用它的最参数化的构造函数。

如果不适合你的情况下工作,那么一个私有方法是一种非常精细的方式来解决这个问题,通常有在试图解决它更没有好处。

那么,把通用代码放在一个构造函数中,并确保从其他所有构造函数中调用它,注意最后一个参数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) { ... }