1

我正在重构一个类以使用带有私有构造函数而不是公共构造函数的构建器。我想让旧的、已弃用的公共构造函数使用构建器,如下所示。(这是我试图实现的行为的一个例子)

// old public construcor
@Deprecated
public MyClazz(){
    return new MyClazzBuilder().Build();
}

这给出了“无法从具有 void 结果类型的方法返回值”

这种类型的功能在 Java 中是否可行?这怎么可能实现?

更新:此代码是分布式 jar 的一部分,删除旧的构造函数不是一种选择,因为我需要保持向后兼容性

4

2 回答 2

3

不,构造函数对一个对象进行操作,他们不返回它。[脚注 1]

获得这种功能的一种方法是使用init()方法。

@Deprecated
public MyClazz() {
  init();
}

public void init() {
  // do the actual work
}

现在您的构建器可以调用相同的init()方法来避免将代码放在两个地方。

因为您保留了已弃用的签名,所以很难避免将准备实例的逻辑拆分到多个位置。这并不理想,但这是弃用和保持向后兼容性的代价。

[脚注1] java对象的生命周期是首先分配对象内存,但所有字段都有垃圾内容。接下来,在内存上运行一个构造函数,通过将所有这些无意义的值更改为实际值来使其进入一致状态。请注意,构造函数工作的内存已经存在,因此您永远不能用另一个对象代替正在构造的对象。构造函数的返回值正是这种替换,语言不支持这种替换。如果需要该技巧,请使用工厂/构建器而不是构造器——构造器永远无法做到这一点。

于 2013-04-26T17:54:25.807 回答
1

构造函数不返回值。注意构造函数签名中没有“声明的”返回类型。你有几个选择:

1) 将构造函数标记为私有并立即解决编译错误
2) 弃用构造函数,并将原始实现保留在那里。

我推荐第 2 项。您所做的是弃用了构造函数,然后更改了实现。这不是弃用的工作方式。

于 2013-04-26T17:55:02.643 回答