【问题标题】:Do you put a super() call a the beginning of your constructors?您是否在构造函数的开头放置了 super() 调用?
【发布时间】:2011-02-12 08:49:20
【问题描述】:

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

正如问题unnecessary to put super() in constructor? 的答案中所解释的,如果您为一个应该使用超类的默认(无参数)构造函数的类编写构造函数,您可以在开头调用super()你的构造函数:

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

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

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

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

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

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

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

【问题讨论】:

  • 我没有,但可能是因为我阅读(并从中学习!)的几乎所有代码都没有。我可能只是在延续我学到的糟糕风格。

标签: java coding-style constructor super redundancy


【解决方案1】:

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

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

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

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

所以,总而言之,我认为这个问题毫无意义。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      你有什么经验?你是否 有一个或另一个问题 方法?

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

      【讨论】:

        【解决方案4】:

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

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

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

          • 当然可以,但那是完全不同的情况:如果你需要传参数,你必须显式调用super(parms),这样就不再是编码风格的问题了...
          【解决方案6】:

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

          【讨论】:

          • 在课程开头说“扩展”这一事实还不够吗;-)?
          • 如果构造函数和类定义同时可见,但情况并非总是如此。我通常把我所有的属性放在我的方法之前。
          【解决方案7】:

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

          【讨论】:

          • 或者你应该开始教育你的同事 ;-)
          【解决方案8】:

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

          我只是不认为有必要。

          【讨论】:

            【解决方案9】:

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

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

            【讨论】:

            • 如果您不确定团队成员是否了解编译器的功能,那么您的问题会更严重...
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-05-17
            • 1970-01-01
            • 1970-01-01
            • 2023-04-09
            相关资源
            最近更新 更多