【问题标题】:How to call both super(...) and this(...) in case of overloaded constructors?如果构造函数重载,如何同时调用 super(...) 和 this(...)?
【发布时间】:2011-10-21 09:19:29
【问题描述】:

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

这是一个示例:

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) 是绝对必须的。在这种情况下如何处理“可选参数”?我能想到的唯一方法是重复,即根本不要调用 this(...) 。只需在每个构造函数中执行赋值。

【问题讨论】:

  • 第一种方法不需要super(user),直接调用this(user,dataCovered,null)即可
  • 最简单的肯定是根本不提供第一个构造函数,如果它需要做的所有事情都包含在第二个构造函数中。只需记录 Price 可以传递 null。

标签: java constructor superclass


【解决方案1】:

你不能同时调用 super(..) 和 this(...)。您可以做的是重新设计重载构造函数的结构,以便最后一个被调用的构造函数将调用 super(...)。 如果这不是一个选项,则必须在每个构造函数中进行分配。

【讨论】:

  • 我就知道一定要这么简单!!当然!我想我正在重构 supers() 已经到位,因此造成混乱!!!
  • 我喜欢使用私有的 void 初始化方法,来做构造函数的通用初始化。
【解决方案2】:

如果你调用this(user,dataCovered,null),第二个构造函数会被调用,它会做的第一件事就是调用超级构造函数。所以第一个构造函数中的super(user);这一行是不必要的。

【讨论】:

  • 你和 S.L 在答案上只相差 4 秒!!我仍然会将 S.L 标记为答案,这将有助于提高他/她的评分...希望您不介意 :)
  • @Nupul 将更好的答案标记为解决方案;当前评分不应高于答案质量。
  • 我同意这一点。 @Nupul,非常感谢礼貌的想法。但请将一个标记为您认为最佳的答案。
  • @dlev:同意。从我的角度来看,这两个答案都与质量/信息完全相同,S.L 还提到了如果他的选择不可行该怎么办的情况。我永远不会为提高某人的评分而标记答案!!!只是我必须在两个答案之间做出选择,彼此相隔 4 秒,我只想让马克(和其他人)知道我的选择。
  • @S.L.请注意,在这种情况下,我不是在评论答案的相对质量:)。我只是说一般来说,最高质量的答案(实际上解决了你的问题)应该被标记为解决方案。
【解决方案3】:

我会在类中的静态方法中分离出您需要在构造函数中执行的逻辑,然后从两个构造函数中调用它,以避免重复。但是,在您的情况下,您可以跳过第一个构造函数对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;
}
}

【讨论】:

  • 所以你会将 price 和 dataCovered 更改为静态字段?
  • @Erik:很有趣。但似乎在“链”中的最后一个“被调用”构造函数上调用 super 似乎是一个更简单的选择!
【解决方案4】:

在构造函数中(其中包括从 super 或 this 调用非实例方法或在其中调用非实例方法)这三个限制:

  • 每个构造函数只能调用一次super(...)this(...)
  • superthis 始终必须是方法中的第一个语句
  • 如果您不提供其中任何一个,则在构造函数的开头有一个隐含的 super()

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

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

【讨论】:

    猜你喜欢
    • 2013-11-17
    • 1970-01-01
    • 2011-05-23
    • 1970-01-01
    • 2019-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多