基本构造函数链调用
我希望这不是一个愚蠢的问题。
具有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
最好的办法是使用这个() - 你并不需要创建一个新的方法,你尊重了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);
}
为什么这是最好的方式? – 2013-04-28 14:52:37
@LewsTherin这是因为,最好的办法()对于由该;-)您不必再创建一个方法,你尊重了DRY原则,很容易。 – Thierry 2013-04-28 14:54:04
假如把它放在你的答案的话..假设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);
}
可以以这种方式使用
代码..但没有解释为什么它更好? – 2013-04-28 14:52:18
我同意不管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) { ... }
您可以使用'this'来链接构造函数,并将初始化代码链接到最后一个构造函数中。 – Luksprog 2013-04-28 14:47:35