JPA,XML - 普遍接受的是非arg私有构造函数吗?

时间:2017-10-10 22:30:29

标签: java jpa jaxb

在许多情况下,私有无参数构造函数是有意义的,例如:

  • 设计为不可变的实例
  • 使用流畅的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+)?或者我冒险并且我很幸运?

1 个答案:

答案 0 :(得分:2)

JPA spec 2.1“实体类”

  

实体类必须具有无参数构造函数。实体类可以   还有其他建设者。 no-arg构造函数必须是 public   或受保护

一些JPA提供程序(例如DataNucleus)根本不需要这样的构造函数(因为它们具有在字节码增强期间添加它的功能),但是完全符合(并且不会让事情变得“幸运”)用户应该提供一个。