繁体   English   中英

JPA,XML-是否普遍接受无参数的私有构造函数?

[英]JPA, XML - Is a no-arg private constructor generally accepted?

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

  • 设计为不可变的实例
  • 使用流畅的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+)过时的公共无参数构造函数(而不是受保护的或私有的)? 还是我冒险,我只是幸运?

JPA规范2.1“实体类”

实体类必须具有no-arg构造函数。 实体类也可以具有其他构造函数。 no-arg构造函数必须是publicprotected

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM