Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.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中需要一个默认的无参数构造函数?_Java_Constructor_Default Constructor - Fatal编程技术网

为什么Java中需要一个默认的无参数构造函数?

为什么Java中需要一个默认的无参数构造函数?,java,constructor,default-constructor,Java,Constructor,Default Constructor,为什么在许多与Java相关的API中需要默认的无参数构造函数?与一般规则一样,所有JavaBean类或实体类(JPA等)或JAX-WS实现类都需要显式无参数构造函数 如果默认情况下Java提供无参数构造函数,那么为什么这些标准中的大多数都需要显式构造函数?我认为需要public空构造函数的框架之所以需要空构造函数,是因为它们使用反射来实例化类型,例如通过 至于为什么默认构造函数在这种情况下可能不起作用,以下是相关的JLS部分: 如果类不包含构造函数声明,则自动提供不带参数的默认构造函数: 如果

为什么在许多与Java相关的API中需要默认的无参数构造函数?与一般规则一样,所有JavaBean类或实体类(JPA等)或JAX-WS实现类都需要显式无参数构造函数


如果默认情况下Java提供无参数构造函数,那么为什么这些标准中的大多数都需要显式构造函数?

我认为需要
public
空构造函数的框架之所以需要空构造函数,是因为它们使用反射来实例化类型,例如通过

至于为什么默认构造函数在这种情况下可能不起作用,以下是相关的JLS部分:

如果
不包含构造函数声明,则自动提供不带参数的默认构造函数:

  • 如果
    被声明为
    公共
    ,则默认构造函数被隐式地赋予访问修饰符
    公共
  • 如果类被声明为
    受保护的
    ,则默认构造函数被隐式地赋予访问修饰符
    受保护的
  • 如果类被声明为
    private
    ,则默认构造函数被隐式地赋予访问修饰符
    private
  • 否则,默认构造函数具有由无访问修饰符暗示的默认访问权限

因此,在
public
类中,默认构造函数将具有正确的可见性,但在其他情况下,必须提供显式的
public
构造函数。

Java仅在没有应用其他构造函数的情况下提供无参数构造函数。在许多Java API(例如JPA、序列化和许多其他从外部表示构建对象的API)中,在设置对象的数据值之前需要对象的实例,因为如何应用值的定义是通过对象的实例成员定义的(例如readExternal(ObjectInput))。如果类只有一个接受某些参数的构造函数,那么库可能无法构造实例,除非定义了单独的无参数构造函数


值得注意的是,这是特定库的实现者的设计选择,可以构建一个API/框架来外部化和重新创建没有无参数构造函数的对象(定义单独的工厂类是一种方法)。需要无参数构造函数的模式首先出现在Java序列化中(我认为),并已被其他库(如JPA)采用为事实上的标准方法。这种方法的缺点是它阻止了不可变对象的使用。

初始化任何非默认值都需要构造函数,并且可能包含所需的副作用

如果您有一种编程风格,它鼓励为数据传输对象使用最小的构造函数,那么这似乎是不必要的,但是库选择不对构造函数采用任何编程风格


您可以编写一个不采用默认构造函数的库,但必须假设构造函数会做什么和不会做什么。i、 e.我已经编写了这样的库,但也能够强制要求构造函数可以做什么,这样不直接调用它是安全的。

Java只提供了一个默认的无参数构造函数,如果没有定义其他构造函数。因此,如果您有其他构造函数,您必须自己显式定义一个无参数构造函数

这些框架使用反射API并查看方法名称来确定如何设置属性。构造函数的参数只能按类型找到,不能按名称找到,因此框架无法可靠地将属性与构造函数参数匹配。因此,它们需要一个无参数构造函数来创建对象,然后可以使用setter方法初始化数据

一些框架可能支持作为替代方案。

两个原因: 1) 在引用数据类型的实例数据字段未初始化时避免NullPointerException。如果这些数据字段在声明时尚未初始化,那么提供显式构造函数将使您有机会初始化这些数据字段
2) 对于希望使用无参数构造函数的用户;如果存在其他构造函数,则不会自动提供这些框架

这些框架中的许多都源自“”的早期思想,尤其是。按照惯例,最小的有用Java对象将具有一个无参数构造函数,并且每个成员都可以通过get/setProperty1和is/setProperty1等方法访问。如果类遵循接口的约定,那么使用反射的工具和框架可以“开箱即用”。

XStream可以将对象序列化为XML,并且不需要无参数构造函数。可见性不是问题,因为反射API可以绕过它。调用super()又如何在默认构造函数中,它在这里起作用吗?