代码之家  ›  专栏  ›  技术社区  ›  sleske

是否将super()调用a放在构造函数的开头?

  •  7
  • sleske  · 技术社区  · 15 年前

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

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

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

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

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

    一方面,人们可能会认为 超级() 使事情更明确。噢,我总是不喜欢写多余的代码,所以我个人倾向于不写;但是我经常在别人的代码中看到它。

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

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

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

    9 回复  |  直到 15 年前
        1
  •  20
  •   Joachim Sauer    15 年前

    我不写 super() 因为同样的原因我不写不必要的类型转换:

    它在不提供任何附加信息的情况下给代码添加了噪声(编译器也没有 也不 给正在阅读我的代码的开发人员)。

        2
  •  4
  •   Bozho    15 年前

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

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

        3
  •  4
  •   Cocowalla    15 年前

    我不知道,但我在大学的时候就这样做的理由是,这样做会让事情变得更明确,所以你不会‘忘记’正在调用一个超类构造函数。

    我只是觉得没必要。

        4
  •  2
  •   Andersson Melo    15 年前

    我用 super() 只有当构造函数 超级() 需要参数。

        5
  •  2
  •   stacker    15 年前

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

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

        6
  •  1
  •   dominic    15 年前

    我从来没有加过,当我的一个同事不明白有人在暗地里给超级班打电话时,我深感震惊,所以也许我应该开始做。

        7
  •  1
  •   Gorpik    15 年前

    优势: 任何阅读您的代码的人都知道,您确实想调用默认构造函数,您并没有因为错误而放弃调用。

    缺点: 你用不重要的信息扰乱你的代码。

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

        8
  •  0
  •   Chris J    15 年前

    我真的把 super() 打电话来,因为我发现这是一个有帮助的记忆助手。当我几个月前写了一段代码并返回时, 超级() 当我看到构造函数时,它会提醒我,我编写的类继承自某些内容。

        9
  •  0
  •   user53682    15 年前

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

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

    但是,如果我有一个lib类,我不能提供额外的依赖项,那么我首先要尝试使用decorator。

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

    总之,我认为这个问题毫无意义。