为什么JavaBean类应该提供公共构造函数

5
我听说JavaBean有规则,其中第一条主要规则是,对于每个JavaBean类,程序员必须显式提供公共默认构造函数。 请问有人能解释一下为什么我们需要为JavaBean提供默认构造函数?
更新:
请清楚地解释一下,为什么JVM不会为JavaBean提供默认构造函数,以及JVM在提供默认构造函数时的反应。

问题已经存在。https://dev59.com/F3E95IYBdhLWcg3wft5w - Jayy
5个回答

17
我听说JavaBean有规则,其中第一条和主要规则是,对于每个JavaBean类,程序员应该明确提供public默认构造函数。请问为什么我们需要为JavaBean提供默认构造函数?
JavaBean实例是通过反射调用无参构造函数创建的。因此必须存在这样的构造函数。
请清楚地解释一下,为什么JVM不会为JavaBeans提供默认构造函数以及JVM在提供默认构造函数时会如何反应。
如果您没有显式提供任何构造函数,则JVM将为JavaBean提供默认构造函数。如果您提供了构造函数,则必须提供一个无参构造函数以及任何定义参数的构造函数。

1
我们可能会在我们的bean中添加一些带参数的构造函数,如果我们的类没有包括默认构造函数,其他构造函数将会掩盖它,从而使它不再是一个有效的bean。

0

这是维基百科上关于Java Bean的说法Java Bean Wikipedia article

该类必须有一个公共默认构造函数(无参数)。这使得在编辑和激活框架内轻松实例化。

实际上,如果一个类拥有默认构造函数,通过内省机制轻松实例化它是很容易的。

 getClass().getClassLoader().loadClass("mypackage.myclass").newInstance();

-1 不是准确的答案,请检查一下,我已经更新了问题。 - developer

0

我怀疑这是对语法和生成的类之间差异的误解。

public class Alpha {
}

public class Beta {
  public Beta() {}
}

Alpha 中,默认构造函数是隐式的;在 Beta 中它是显式的。两者都有默认的公共构造函数,符合 JavaBean 规范。
public class Gamma {
  private final Type t;
  public Gamma(Type t) {
    this.t = t;
  }
}

另一方面,Gamma 不符合要求,因为没有公共的无参构造函数。在没有关于如何填充构造函数的上下文信息的情况下,将无法实例化此对象。

0
根据我的经验,这是为了防止有人添加带参数的构造函数,从而有效地删除默认构造函数。通过显式实现默认构造函数,这种情况更不太可能发生。

除非调用带参数的构造函数,否则JVM不会调用带参数的构造函数,即使该类中定义了带参数的构造函数。 - developer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接