我正在重构一个类,以使用带有私有(private)构造函数而不是公共(public)构造函数的构建器。我想让旧的、已弃用的公共(public)构造函数使用如下所示的构建器。 (这是我尝试实现的行为示例)
// old public construcor
@Deprecated
public MyClazz(){
return new MyClazzBuilder().Build();
}
这给出了“无法从结果类型为 void 的方法返回值”
这种类型的功能在 Java 中是否可行?这是如何实现的?
更新:此代码是分布式 jar 的一部分,删除旧的构造函数不是一个选项,因为我需要保持向后兼容性
最佳答案
没有。构造函数对一个对象进行操作,它们不返回它。 [脚注 1]
获得这种功能的一种方法是使用 init()
方法。
@Deprecated
public MyClazz() {
init();
}
public void init() {
// do the actual work
}
现在您的构建器可以调用相同的 init()
方法来避免代码出现在两个地方。
因为您保留了已弃用的签名,所以很难避免将准备实例的逻辑拆分到多个地方。这并不理想,但这是弃用和保持向后兼容性的代价。
[footnote 1] java对象的生命周期是先分配对象内存,但是所有字段都是垃圾内容。接下来,在内存上运行构造函数,通过将所有这些无意义的值更改为实际值,使其进入一致状态。请注意,构造函数所处理的内存已经存在,因此您永远不能用另一个对象代替正在构造的对象。构造函数的返回值正是这种语言不支持的替换。如果需要该技巧,请使用工厂/构建器而不是构造器——构造器永远无法做到这一点。
关于java - 构造函数可以使用生成器吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16242412/