繁体   English   中英

您是否将super()调用作为构造函数的开始?

[英]Do you put a super() call a the beginning of your constructors?

这是有关编码样式和推荐做法的问题:

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

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

但您也可以忽略该呼叫; 在这两种情况下,编译器都将充当super()调用。

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

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

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

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

没有其他构造函数时,是否有理由明确地编码默认构造函数?

我不编写super()调用的原因与我不编写不必要的强制类型转换的原因相同:

它在不提供任何其他信息的情况下(不对编译器对阅读我的代码的开发人员而言)增加了代码的噪音。

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

是否编写它取决于谁将阅读它。 我不希望添加它,但是如果不确定团队成员是否了解编译器的工作以及对象构造的方式,则可以“以防万一”添加它。

我没有,但是在大学期间给我的理由是这样做可以使事情变得更加明确,因此您不必“忘记”正在调用超类构造函数。

我只是没有看到需要。

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

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

仅在构造函数super()需要参数时才使用super()

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

优点:任何阅读您的代码的人都知道您确实要调用默认构造函数,而您并没有错误地忽略该调用。

缺点:您的代码杂乱无章。

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

我实际上把super()调用放入,因为它是一个有用的内存助手。 当我几个月前写了一段代码并返回时,当我在查看构造函数时, super()提醒我所编写的类是从某些东西继承的。

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

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

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

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

因此,总的来说,我认为这个问题毫无意义。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM