java - 构造函数可以使用生成器吗

标签 java constructor refactoring builder

我正在重构一个类,以使用带有私有(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/

相关文章:

javascript - DevExpress 在 Javascript 重构方面走多远?

java - 方法的集中职责

java - 使用另一个对象及其哈希码从 HashMap 获取 key

java - jpa 更新/删除查询不起作用

Java 相当于 Knockout.js 计算可观察量?

Java - 为外部库中的类定义公共(public)接口(interface)

php - 如何在构造函数中调用实体管理器?

javascript - 使用变量访问构造函数并获取想要的字符串

php - 既然可以在声明时设置变量,为什么还要在 PHP 类的结构中设置变量呢?

c# - 重构我的 C# 代码 - Switch 语句