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

时间:2010-02-18 20:12:24

标签: java default-constructor

我最近在一个类中看到了这个构造函数:

public MyClass(){ }

没有其他建设者。

这有什么理由吗? Java会自动创建一个默认构造函数,那么为什么要显式声明一个呢?或者这被认为是一种良好的做法,就像对单语句if语句使用大括号一样 - 如果稍后添加其他构造函数并且您忘记了没有默认值......?

8 个答案:

答案 0 :(得分:16)

在这种情况下,有几个小点不太可能是你看到它的原因。

  • 它为您提供了设置断点的功能。
  • 您可以将其设为非公开

至于“如果以后添加其他构造函数并且您忘记了没有默认值” - 这可能是一个原因,我想。但是如果添加了非默认构造函数,那么使用默认构造函数的任何代码都将无法编译,因此添加新构造函数的人通常也需要为默认的ctor添加一个defintion。

然后再一次,我无法想到定义空ctor的任何特别的伤害(虽然现在我输入了那个,我感觉有人可能会指出C ++的某个角落它可能会咬你)

答案 1 :(得分:6)

它不起任何作用,可以安全删除。

答案 2 :(得分:3)

这是Java语言规范所说的:

  

如果一个类不包含构造函数   声明,然后默认   不带参数的构造函数   自动提供:

     
      
  • 如果声明的类是原始类Object,那么   默认构造函数有一个空体。
  •   
  • 否则,默认构造函数不带参数,只需调用   没有的超类构造函数   参数。
  •   

因此无论如何都会创建默认构造函数。如果你不这样做,就没有意义。不得不。

IMO只有在想要更改构造函数的可见性级别时才应该这样做,即将其设为私有或受包保护

答案 3 :(得分:3)

虽然通过在技术层面明确添加构造函数没有获得任何结果,但是可能有理由这样做。一种情况是,如果通过反射实例化类,您可能希望在默认构造函数上放置一些文档以指示它是必需的,即使添加新的构造函数也不会导致编译错误。

另一个原因是一些编码标准更喜欢它,以便明确地表明你考虑过这个类应该具有什么样的构造函数。

答案 4 :(得分:1)

因为你相信the zen of python的第二句:

  

明确比隐含更好。

答案 5 :(得分:0)

如果我错了(我暂时没有完成Java),请纠正我,但这不会阻止对父构造函数的调用吗?在这种情况下,推理显然是父母会自动做一些你不希望在这堂课中发生的事情。

答案 6 :(得分:0)

我被告知 java bean规范需要公共默认构造函数。维基百科页面http://en.wikipedia.org/wiki/Java_Bean也将其列为要求。

另一方面,我查看了Sun / Oracle站点,但没有找到它。见http://java.sun.com/developer/onlineTraining/Beans/Beans1/simple-definition.html

答案 7 :(得分:0)

实际上有充分的理由在这些答案中包含未提及的内容:

如果无参数构造函数的存在明确是对象的合约的一部分,那么应该明确声明

如果您明确打算让客户端对您的代码进行子类化,例如Java Swing,即使没有其他构造函数,也可以明确地创建一个可访问的无参数构造函数。否则,如果另一个程序员以他们的智慧决定创建另一个构造函数,那么新的显式构造函数将删除隐式的无参数构造函数并破坏客户端代码。

如果代码在您自己的代码库中被分类,那么这将显示为编译器错误,但如果您的代码要作为jar发布,并且客户端分类,则不会出现编译器错误。

当然,你可以争辩说,如果你的合同的一部分,你应该有一个junit测试,你会是对的!但是如果您正在开发一个大型代码库,其中测试需要花费数小时来运行您的日常构建,因为您忘记了在添加构造函数时必须明确地创建一个无参数构造函数,这是一个显式构造函数的浪费时间并且评论可以避免任何错误的机会。

优秀代码的目标是让其他开发人员尽可能轻松地更改它而不会出错!