2013-08-07 130 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.

相关问题