7

这是一个关于编码风格和推荐实践的问题:

正如问题的答案中所解释的,不需要将 super() 放入构造函数中?,如果您为应该使用超类中的默认(无参数)构造函数的类编写构造函数,则可以super()在构造函数的开头调用:

public MyClass(int parm){
  super(); // leaving this out makes no difference
  // do stuff...
}

但你也可以省略调用;在这两种情况下,编译器都会像 super() 调用一样。

那么,您是否将调用放入构造函数中?

一方面,有人可能会争辩说,包括在内super()会使事情更加明确。OTOH,我总是不喜欢编写冗余代码,所以我个人倾向于将其省略;但是,我确实经常在其他人的代码中看到它。

你有什么经验?您对一种或另一种方法有疑问吗?您是否有规定一种方法的编码指南?

顺便说一句:一个相关的问题(仅供参考):

当没有其他构造函数时,是否有理由显式编写默认构造函数?

4

9 回答 9

20

我不写super()电话的原因与我不写不必要的演员表的原因相同:

它在不提供任何额外信息的情况下给代码添加了噪音(既不提供给编译器,也不提供给阅读我的代码的开发人员)。

于 2010-04-26T11:28:12.583 回答
4

某些 IDE 的某些版本的默认设置会自动生成它,因此您可能会看到它的原因之一。

写不写取决于谁来读。我不想添加它,但如果您不确定团队成员是否了解编译器的功能以及对象构造如何进行,您可以“以防万一”添加它。

于 2010-04-26T11:25:47.967 回答
4

我不知道,但在大学时给我的理由是它使事情更加明确,所以你不会“忘记”正在调用超类构造函数。

我只是不认为有必要。

于 2010-04-26T11:26:45.160 回答
2

你有什么经验?您对一种或另一种方法有疑问吗?

我从未调用过默认构造函数(显式),也从未遇到任何问题

于 2010-04-26T11:27:11.883 回答
2

super()只在构造函数super()需要参数时使用。

于 2010-04-26T11:33:21.043 回答
1

我从来没有添加它,当一位同事不理解对超级类进行了隐式调用时,我感到非常震惊,所以也许我应该开始这样做。

于 2010-04-26T11:28:21.477 回答
1

优点:任何阅读您的代码的人都知道您确实想调用默认构造函数,您没有错误地离开调用。

缺点:您的代码中包含不重要的信息。

通常,如果一种语言允许您省略一些指令,那么这样做的风格还不错。我认为这是一个权衡利弊的问题。例如,super()当你的构造函数有参数并且基类也有可用的参数构造函数时,显式编写可能是一个好主意。

于 2010-04-26T11:44:14.480 回答
0

我实际上把super()电话打进去了,因为我发现它是一个有用的记忆助手。当我几个月前写了一段代码并返回它时,super()当我查看构造函数时提醒我我编写的类继承自某些东西。

于 2010-04-26T11:32:47.380 回答
0

我尽量避免在需要调用 super() 的地方编写代码,因为我更喜欢组合而不是继承。

如果我必须从另一个类派生,我会尝试将两者放在自己的接口后面,并将其中一个作为依赖项传递给另一个。

但是,如果我有一个 lib 类,但我无法提供额外的依赖项,那么我尝试的第一件事就是使用装饰器。

如果这不起作用,并且我必须从实现中派生,我认为是否编写super()并不重要,因为它很少发生;)

So, all in all, I think this question is pointless.

于 2010-04-26T12:43:32.737 回答