我曾经认为,直观地说,Java 中的构造函数是生成对象的东西,在构造函数返回之前,没有任何东西可以触及该对象。但是,我一次又一次地被证明是错误的:
- 未初始化的对象可以通过共享泄露
this
- 未初始化的对象可能会被从终结器访问它的子类泄漏
- 未初始化的对象可以在它们完全构造之前泄漏到另一个线程
所有这些事实都违反了我对构造函数的直觉。
我不再有信心说出构造函数在 Java 中的实际作用,或者它的用途。如果我正在使用所有 final 字段制作一个简单的 DTO ,那么我可以理解构造函数的用途,因为这与 C 中的 struct 完全相同,只是它不能被修改。除此之外,我不知道在 Java 中可以可靠地使用哪些构造函数。它们只是约定/语法糖吗?(即如果只有工厂为您初始化对象,那么您将只有X x = new X()
, 然后修改其中的每个字段x
以使它们具有非默认值 - 鉴于上述 3 个事实,这几乎等同于 Java 的实际情况)
我可以命名构造函数实际上保证的两个属性:如果我这样做X x = new X()
,那么我知道它x
是 的实例X
但不是 的子类X
,并且它的最终字段已完全初始化。你可能想说你知道X
finished的构造函数并且你有一个有效的对象,但如果你传递X
给另一个线程,这是不正确的——另一个线程可能会看到未初始化的版本(即你刚才说的与保证调用工厂)。构造函数实际上保证了哪些其他属性?