我最近在一个类中看到了这个构造函数:
public MyClass(){ }
没有其他构造函数。
是否有一个原因?Java 会自动创建一个默认构造函数,那么为什么要显式声明一个呢?或者这被认为是一种好的做法,就像在单语句 if 语句中使用大括号一样——以防以后添加其他构造函数并且你忘记了你没有默认值......?
我最近在一个类中看到了这个构造函数:
public MyClass(){ }
没有其他构造函数。
是否有一个原因?Java 会自动创建一个默认构造函数,那么为什么要显式声明一个呢?或者这被认为是一种好的做法,就像在单语句 if 语句中使用大括号一样——以防以后添加其他构造函数并且你忘记了你没有默认值......?
一些小问题不太可能是您在这种情况下看到它的原因。
至于“以防以后添加其他构造函数而您忘记了没有默认值”-我想这可能是一个原因。但是如果添加了非默认构造函数,任何使用默认构造函数的代码都将无法编译,因此添加新构造函数的人通常还需要为默认 ctor 添加定义。
再说一次,我想不出定义空 ctor 有什么特别的危害(尽管现在我已经输入了它,但我感觉有人可能会指出 C++ 的某个角落,它可能会咬你)。
它没有任何作用,可以安全地删除。
这是 Java 语言规范所说的:
如果一个类不包含构造函数声明,则自动提供一个不带参数的默认构造函数:
- 如果声明的类是原始类 Object,则默认构造函数的主体为空。
- 否则,默认构造函数不带参数,只是简单地调用不带参数的超类构造函数。
所以无论如何都会创建默认构造函数。不写就没有意义。不得不。
IMO 只有在您想更改构造函数的可见性级别时才应该这样做,即使其私有或受包保护
尽管在技术层面显式添加构造函数并没有获得任何好处,但仍有潜在的理由这样做。一种是如果类是通过反射实例化的,您可能希望在默认构造函数上放置一些文档以指示它是必需的,即使添加新构造函数不会导致编译错误。
另一个是一些编码标准更喜欢它,以便明确地表明你考虑过这个类应该有什么样的构造函数。
因为你相信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 中,那么即使没有其他构造函数,显式创建一个可访问的无参数构造函数也是一个好主意。否则,如果另一个程序员根据他们的智慧决定创建另一个构造函数,新的显式构造函数将删除隐式无参数构造函数并破坏客户端代码。
如果代码在您自己的代码库中被子类化,那么这将显示为编译器错误,但如果您的代码要作为 jar 发布,并由客户端进行子类化,则不会出现编译器错误。
当然,您可以争辩说,如果它是您合同的一部分,您应该对此进行junit测试,您是对的!但是,如果您正在处理一个大型代码库,而您的日常构建需要几个小时来运行测试,那么会破坏您的日常构建,因为您忘记了在添加构造函数时必须显式创建无参数构造函数,而显式构造函数会浪费大量时间并且评论可以避免任何出错的机会。
好代码的目标是让其他开发人员尽可能轻松地更改它而不会出错!