[英]How to call both super(…) and this(…) in case of overloaded constructors?
我以前从未需要这样做,但由于两者都必须是构造函数中的“第一行”,应该如何解决它? 对于这样的情况,最好的重构是什么?
这是一个示例:
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)
的调用绝对必须。 在这种情况下如何处理“可选参数”? 我能想到的唯一方法就是重复,即根本不要称之为(...)。 只需在每个构造函数中执行赋值。
你不能同时调用super(..)和this(...)。 你可以做的是重新设计你的overloadeded构造函数的结构,这样最后一个被调用的将调用super(...)。 如果这不是一个选项,您将必须在每个构造函数中进行分配。
如果你调用this(user,dataCovered,null)
,将调用第二个构造函数,它将要做的第一件事就是调用超级构造函数。 所以行super(user);
在第一个构造函数中是不必要的。
在构造函数中,有(除了其他类似调用非超级或此内的实例方法)这三个限制:
super(...)
或this(...)
super
或者this
总是必须是方法中的第一个语句 super()
原因是对象只能创建一次。 而super
通过调用重载的构造函数来创建一个对象,而这是委托给同一个类的另一个构造函数。
正如另一个答案所说,在你的情况下,你不需要第一个super
因为你的this
语句委托给已经调用super(user)
的另一个构造函数。
我将在类中的静态方法中将构造函数中需要执行的逻辑分离出来,并将其称为两个构造函数,以避免重复。 但是,在您的情况下,您可以从第一个构造函数中跳过对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;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.