2013-08-07 171 views
18

這可能聽起來很愚蠢, 但爲什麼我需要在我的@Entity s中定義一個空構造函數?Java實體 - 爲什麼我需要一個空構造函數?

我看到的每個教程都說:每個實體都需要一個空的構造函數。

但是Java總是給你一個默認的不可見的空構造函數(如果你不重定義的話)。

謝謝。

編輯

我覺得有一個語義問題。 我所理解的「需要」是寫。

含義:總是在你的實體中寫一個空構造函數。

例如:

@Entity 
public class MyEntity implements Serializable { 

    @Id 
    private String str; 

    public MyEntity(){} 

    //here getter and setter 
} 

但Java總是給你這個空的構造,當你不重新定義它(寫的另外一個帶參數)。

在這種情況下寫這個空的構造函數似乎沒用。

+0

嗯,這並不總是必要的,除非你想給特定的值,以您的數據成員。 –

+1

@ JavaNewbie_M107 Emtpy構造函數是強制性的(是的,它可以是默認的,但仍然有一定的不帶參數的構造函數) – Antoniossss

+0

如果你有一個公共類,JAVA居然給你一個公共_visible_(而不是_invisble_)空的構造函數。 – steffen

回答

25

一個空的構造函數通過持久化框架來創建通過反射一個新的實例。如果您沒有爲該類提供任何其他帶有參數的構造函數,則不需要提供空構造函數,因爲每個默認值都會得到一個。

您還可以使用@PersistenceConstructor註解,它看起來像下面

@PersistenceConstructor 
public Movie(Long id) { 
    this.id = id; 
} 

初始化你的實體如果Spring數據出現在項目中。因此你也可以避免使用空構造函數。

+1

然後框架是不好的,因爲他們可以很容易地在一般使用不安全 – Enerccio

+0

所以你說的框架是不好的,因爲他們可能使用不安全?我不得不不同意。首先,對於構造函數注入來說,你不需要不安全的,反射就可以做到這一點。其次,還有什麼替代方法,試圖自己寫一些大型開發者社區已經爲你做的一切? – u6f6o

+0

不,我說的要求你提供空構造函數的框架是不好的,因爲如果你不提供空的構造函數,它們可以使用'Unsafe' – Enerccio

3

除非您爲實體提供另一個構造函數,否則不需要顯式定義默認構造函數。如果你提供了另一個構造函數,除了缺省構造函數的簽名之外,默認的構造函數將不會被創建。

由於JPA實現依賴於默認構造函數的存在,因此需要包含將被省略的默認構造函數。

+1

我強烈反對,實體必須具有空的構造函數通過反射來創建實例。 – Antoniossss

+0

你熟悉JPA實現的是什麼?使用休眠我永遠不會被迫包含一個默認構造函數,除非上面突出顯示的情況存在。 –

+0

你不必提供沒有參數的構造函數,因爲你有默認的 - 所以你有一個。我沒有寫出你必須寫出你自己的空白的權利? :) – Antoniossss

17

但是java總是會給你一個默認的不可見的空構造函數(如果你不需要重新定義它) 。

只有當您沒有在您的課堂中提供任何構造函數時,此聲明才爲真。如果在你的類中提供了一個參數構造函數,那麼jvm將不會添加無參數構造函數。

1

其實你不需要寫它。你有它默認情況下。有時候,你可以創建private構造,以防止用戶使用默認

public class MyClass{ 

private MyClass(){} 

} 

對於singelton模式,例如,您可以阻止使用默認的構造函數。

有時,當您使用Gson插件將字符串轉換JSON數據到對象,它要求寫默認構造函數,否則它不能正常工作

-1

從JPA標籤,我想你正在使用Java bean。每個豆需要具有以下屬性:

  1. 所有主實例變量的獲取者和設置者。

  2. 一個空構造函數。

  3. 所有實例變量最好應private

因此聲明:「每個實體都需要一個空構造函數」。

0

的Java並不總是給你一個默認的隱形空構造函數,如果你的類有參數的構造函數,則必須由你自己來定義空的構造。需要

3

正如你所指定的「JPA」標籤,我想你的問題適用於JPA,而不是空洞的構造一般。

Persitence框架通常使用反射,更具體地說Class<T>.newInstance()實例化您的對象,然後通過內省調用getters/setters來設置字段。

這就是爲什麼你需要一個空的構造函數和getters/setters。

this StackOverflow question about empty constructors in Hibernate.

相關問題