如果重载构造函数,如何调用super(…)和this(…)?

我以前从未需要这样做,但由于两者都必须是构造函数中的“第一行”,应该如何解决它? 对于这样的情况,最好的重构是什么?

这是一个示例:

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(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; } } 

在构造函数中,有(除了其他类似调用非超级或内部的实例方法)这三个限制:

  • 每个构造函数只能调用一次super(...)this(...)
  • super或者this总是必须是方法中的第一个语句
  • 如果你不提供任何这些,你在构造函数的开头有一个隐式的super()

原因是对象只能创建一次。 而super通过调用重载的构造函数来创建一个对象,而这是委托给同一个类的另一个构造函数。

正如另一个答案所说,在你的情况下,你不需要第一个super因为你的this语句委托给已经调用super(user)的另一个构造函数。