【发布时间】:2017-10-10 22:30:28
【问题描述】:
在很多情况下,使用私有的无参数构造函数是有意义的,例如:
- 设计为不可变的实例
- 使用 builder 构建的值对象,使用流式 API
当我愿意在持久性单元中使用这些对象或 / 以及作为 REST 接口中的可传输对象时,我会添加一些 JPA 或 / 和 XML 注释。在这个过程中,我希望我的不可变对象保持不可变对象,我希望我的值对象保持值对象。毕竟,我为什么要改变这些对象的性质,只是因为我想将它们用作可转移对象或持久数据?
例子:
@XmlType
public class Endpoint {
@XmlElement
private String hostname = "localhost";
@XmlElement
private int port = 8080;
@XmlElement
private String path = "/";
private Endpoint() {}
public String hostname() {
return hostname;
}
// etc...
@XmlTransient
static public class Builder {
private Endpoint endpoint = new Endpoint();
public Builder hostname(String hostname) {
endpoint.hostname = hostname;
return this;
}
// etc...
public Endpoint build() {
Endpoint newInstance = endpoint;
endpoint = null;
return newInstance;
}
}
}
当然,我最喜欢的 IDE 开始报告一些警告:应该有一个公共的无参数构造函数,...我可以更改我的无参数构造函数并将其公开,因此允许我的客户使用它。但是它打破了始终使用构建器来构造对象实例的最初想法。无论如何,在某些情况下使用默认构造函数没有任何意义。
据我所知,我使用过的所有 JAXB 或 JPA 实现都能够实例化我的对象。我试过 JAXB RI、MOXy、Hybernate、EclipseLink;所有这些库似乎都可以毫无问题地接受我的构造。
因此我的问题是: 最近的库是否要求有一个公共的无参数构造函数(而不是受保护的或私有的)以某种方式过时(Java 8+)?还是我在冒险,我只是幸运?
【问题讨论】: