【问题标题】:JPA, XML - Is a no-arg private constructor generally accepted?JPA,XML - 是否普遍接受无参数私有构造函数?
【发布时间】: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+)?还是我在冒险,我只是幸运?

【问题讨论】:

    标签: java jpa jaxb


    【解决方案1】:

    JPA 规范 2.1“实体类”

    实体类必须有一个无参数的构造函数。实体类可以 还有其他构造函数。无参数构造函数必须是 public受保护

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

    【讨论】:

    • +1 表示问题的 JPA 部分。使用受保护的无参数构造函数应满足大多数需求(不变性、值对象、构建器......)。顺便说一句,DataNucleous 提供的解决方案,即字节码增强是我希望在未来越来越多地看到的东西。至少我希望如此。
    猜你喜欢
    • 2013-01-19
    • 2012-01-21
    • 1970-01-01
    • 2011-02-08
    • 1970-01-01
    • 2019-10-16
    相关资源
    最近更新 更多