2010-04-26 91 views
6

这是一个关于编码风格的问题和建议的做法:您是否将super()调用作为构造函数的开始?

正如在回答这个问题unnecessary to put super() in constructor?解释,如果你写的是应该使用默认的(无参数)从构造函数的类的构造函数父类,你可以在你的构造函数的调用开始super()

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

,但你也可以省略通话;在两种情况下,编译器都会像超级()调用那样执行。

那么,你是否把你的构造函数调用或不?

一方面,有人可能会争辩说,包括super()使事情更加明确。 OTOH,我总是不喜欢写冗余的代码,所以我个人倾向于把它留下来;然而,我经常从别人的代码中看到它。

你有什么经验?您是否遇到过这种或那种方法的问题?你有编码准则,规定了一种方法?

BTW:一个相关的问题(仅供参考):

Is there a reason to explicitly code a default constructor when there are no other constructors?

+0

我不这样做,但可能是因为我读的所有代码(以及从中学到的)都没有。我可以简单地延续我学到的不良风格。 – 2010-04-26 11:27:58

回答

20

我不写super()呼叫出于同样的原因,我不写不必要的强制转换:

它增加了噪声代码没有提供任何额外的信息(既不是编译器也不是给开发者阅读我的代码)。

+3

+1“避免噪音”。代码很难读取...... – sleske 2010-04-26 11:52:41

4

有些IDE的某些版本的缺省设置自动生成的,所以这是一个原因,你可能会看到它。

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

+7

如果你不确定团队成员了解编译器做什么,那么你有更严重的问题... – sleske 2010-04-26 11:52:00

+1

true :)(15chrs) – Bozho 2010-04-26 12:00:01

4

我不这样认为,但是在大学期间这样做的理由是它让事情变得更加明确,所以你不会“忘记”超类构造函数被调用。

我只是没有看到需要寿。

2

您有什么经验?您是否 与其中一个或另一个 方法有问题?

我从来没有所谓的默认构造函数(明确的),从来没有遇到任何问题

+0

-1你可能做了......暗含 – Tomas 2010-04-26 11:41:08

+0

@Tomas - 当然是,固定它现在快乐吗? – stacker 2010-04-26 11:45:13

1

我从来没有加过它,当一位同事不明白有超级类的暗示调用,所以我应该开始做这件事时,我深感震惊。

+8

或者,也许你应该开始教育你的同事,而不是;-) – 2010-04-26 11:33:17

0

我真的把super()调用,因为我觉得它是一个有用的记忆助手。当我几个月前写了一段代码并返回时,super()提醒我,当我查看构造函数时,我写的类继承了某些东西。

+4

是不是说它在课程开始时“扩展”的事实足够了;-)? – sleske 2010-04-26 11:51:25

+0

这将是如果构造函数和类定义可以在同一时间查看,并非总是如此。我通常把我所有的属性放在我的方法之前。 – 2010-04-26 13:22:23

1

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

+3

当然,但这是一个完全不同的情况:如果你需要传递参数,你必须显式调用super(parms),所以它不再是编码风格的问题...... – sleske 2010-04-26 11:47:38

1

优点:任何读你的代码的人都知道你真的想调用默认的构造函数,你没有把错误留下。

缺点:你用不重要的信息混淆了你的代码。

通常,如果一种语言让你省略某些指令,那么这样做可不错。我认为这是一个权衡利弊的问题。例如,当你的构造函数有参数并且基类也有参数化的构造函数时,明确地写super()可能是一个好主意。

0

我尽量避免编写需要调用super()的代码,因为我比起继承更喜欢构图。

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

但是,如果我有一个lib类,我不能给一个额外的依赖项,我尝试的第一件事就是使用装饰器。

如果这也不行,我有从执行的派生,我觉得也无所谓是否写入super()与否,因为它发生如此罕见;)

所以,这一切的一切,我认为这个问题是毫无意义的。

相关问题