Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA,XML-是否普遍接受无参数私有构造函数?_Java_Jpa_Jaxb - Fatal编程技术网

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

Java JPA,XML-是否普遍接受无参数私有构造函数?,java,jpa,jaxb,Java,Jpa,Jaxb,在许多情况下,使用私有无参数构造函数是有意义的,例如: 设计为不可变的实例 使用fluent API使用生成器生成的值对象 当我愿意在持久化单元中使用这些对象或/或在REST接口中作为可转移对象时,我会添加一些JPA或/和XML注释。在这个过程中,我希望我的不可变对象保持不变,我希望我的值对象保持值对象。毕竟,我为什么要仅仅因为想将这些对象用作可转移对象或持久数据而改变它们的性质呢 例如: @XmlType public class Endpoint { @XmlElement

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

  • 设计为不可变的实例
  • 使用fluent 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开始报告一些警告:应该有一个公共的无参数构造函数,。。。我可以更改我的no-arg构造函数并将其公开,从而允许我的客户机使用它。但它打破了始终使用生成器构造对象实例的最初想法。无论如何,在某些情况下,使用默认构造函数没有任何意义

就我所记得的,我使用过的所有JAXB或JPA实现都能够实例化我的对象。我试过JAXB RI、MOXy、Hybernate、EclipseLink;所有这些库似乎都毫无问题地接受了我的构造

因此,我的问题是: 在最近的库中,公共无参数构造函数(不受保护或私有)的要求是否已经过时(Java8+)了?还是我在冒险,只是运气好?

JPA spec 2.1“实体类”

实体类必须具有无参数构造函数。实体类可以 还有其他的构造器。无参数构造函数必须是公共的 或受保护


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

+1对于问题的JPA部分。使用受保护的无参数构造函数应满足大多数需求(不变性、值对象、构建器等)。顺便说一句,DataNucleous提供的解决方案,即字节码增强,是我期望在未来越来越多地看到的东西。至少我希望如此。