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

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

public MyClass(){ } 

没有其他建设者。

是否有一个原因? Java会自动创建一个默认构造函数,那么为什么要显式声明一个呢? 或者这被认为是良好的做法,就像对单语句if语句使用大括号一样 – 如果稍后添加其他构造函数而你忘记了你没有默认值……?

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

  • 它为您提供了设置断点的function。
  • 你可以把它变成非公开的

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

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

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

这是Java语言规范所说的:

如果类不包含构造函数声明,则会自动提供不带参数的默认构造函数:

  • 如果声明的类是原始类Object,则默认构造函数具有空体。
  • 否则,默认构造函数不接受任何参数,只调用不带参数的超类构造函数。

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

IMO只有在想要更改构造函数的可见性级别时才应该这样做,即将其设置为private或package protected

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

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

因为你相信python禅的第二句话:

显式优于隐式。

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

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

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

实际上有充分的理由将这些答案中没有提到的内容包括在内:

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

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

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

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

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