在不扩展任何内容的类中调用super()是不好的做法吗?

时间:2011-01-13 11:01:45

标签: java inheritance

我常常看到人们在没有明确扩展任何内容的类中显式调用super()

public class Foo
{
  public Foo()
  {
    super();

    //do other constructor stuff
  }
}

现在我知道这是完全合法的,如果省略,编译器会添加调用,但我仍然认为这是不好的做法。每当我看到这个,我想知道程序员是否对继承有误解,以及所有类都隐含地扩展Object

我应该将其添加到我们的编码标准/最佳实践中吗?当我看到他们这样做时,我是否应该拉出团队中的其他开发人员?它是我的个人虫子,但我不知道我是否只是挑剔。

6 个答案:

答案 0 :(得分:19)

虽然我是一个一致的人,但我也反对微观管理每一种风格。拥有大量的编码约定,特别是当其中一些似乎是任意的时,是阻止人们遵循它们的一部分。我认为编码指南应该简化为提高功能的最有价值的实践。通过强制执行这种做法,可读性,可维护性,性能等提高了多少?

虽然我个人的做法是在这种情况下致电super(),但其严重性不足以让我将其纳入编码指南或称其为审核其他方面的缺陷程序员的代码。然而,我仍然会提及它并在代码评论中讨论它(不是缺陷,只是作为一种风格问题),试图游说更多的工程师 NOT 使用这个电话。

答案 1 :(得分:8)

添加不需要的代码始终是一种不好的做法。它将使代码的可读性降低,因为您需要停止并开始想知道为什么添加这行代码以及实际上是否有原因。

答案 2 :(得分:6)

它将隐式被调用,因此没有需要这样做

答案 3 :(得分:3)

需要指出的是:

  • 无论是否继承任何内容,调用super()都是毫无意义的;如果不调用基类的隐式构造函数
  • ,那么它是有意义的
  • 问题应该是“做一些完全没有意义的不良做法吗?”。答案显而易见 - 是的!

答案 4 :(得分:1)

默认情况下,显式超级构造函数调用通常由自动代码生成器添加,所以它并不总是与程序员的不良做法有关。或者也许不好的做法就是无疑地留下愚蠢的生成代码。

Eclipse特别生成这个超级调用(从超类生成构造函数),但是,我对其他IDE没有太多经验。 (在评论中写下你的经验。)我的另一个“最喜欢的”默认生成代码是接口的方法声明:'public abstract',它是完全冗余的。

答案 5 :(得分:0)

super()调用由JDeveloper隐式添加。 在编写自己的类时,没有必要和有用的做法。