簡體   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