我之前从未需要这样做,但由于两者都必须是构造函数中的“第一行”,应该如何解决它?对于这样的情况,最好的重构是什么?
以下是一个示例:
public class Agreement extends Postable {
public Agreement(User user, Data dataCovered)
{
super(user);
this(user,dataCovered,null);
}
public Agreement(User user,Data dataCovered, Price price)
{
super(user);
if(price!=null)
this.price = price;
this.dataCovered = dataCovered;
}
...
}
对super(user)
的调用绝对必须。在这种情况下如何处理“可选参数”?我能想到的唯一方法就是重复,即根本不要称之为(...)。只需在每个构造函数中执行赋值。
答案 0 :(得分:13)
你不能同时调用super(..)和this(...)。你可以做的是重新设计你的overloadeded构造函数的结构,这样最后一个被调用的将调用super(...)。 如果这不是一个选项,您将必须在每个构造函数中进行分配。
答案 1 :(得分:6)
如果你调用this(user,dataCovered,null)
,将调用第二个构造函数,它将要做的第一件事就是调用超级构造函数。所以第一个构造函数中的行super(user);
是不必要的。
答案 2 :(得分:0)
在构造函数中有(除了其他类似调用不是来自或超出或者内部的实例方法)这三个限制:
super(...)
或this(...)
super
或this
始终必须是方法super()
原因是对象只能创建一次。并且super
通过调用重载的构造函数来创建一个对象,而这是委托给同一个类的另一个构造函数。
正如另一个答案所说的那样,在您的情况下,您不需要第一个super
,因为您的this
语句正在委托给已经调用super(user)
的其他构造函数。
答案 3 :(得分:0)
我将在类中的静态方法中将构造函数中需要执行的逻辑分离出来,并将其称为两个构造函数,以避免重复。但是,在您的情况下,您可以跳过第一个构造函数的super(user)
调用,第二个将为您调用它:)。我会颠倒构造函数之间的“依赖关系”,如下所示:
public class Agreement extends Postable {
public Agreement(User user, Data dataCovered)
{
super(user);
setDataCovered(dataCovered);
}
public Agreement(User user, Data dataCovered, Price price)
{
this(user, dataCovered);
if(price!=null)
setPrice(price);
}
private static void setDataCovered(Data dataCovered) {
this.dataCovered = dataCovered;
}
private staitc void setPrice(Price price) {
this.price = price;
}
}