构造函数是否可以使用构建器

时间:2013-04-26 17:52:35

标签: java constructor refactoring builder

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

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

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

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

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

2 个答案:

答案 0 :(得分:3)

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

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

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

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

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

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

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

答案 1 :(得分:1)

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

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

我建议使用数字2.您所做的是弃用构造函数,然后更改实现。这不是弃用的方式。