问题

我明白,我认为,“Bean”是一个具有属性和getter / setter的Java类。据我所知,它相当于一个C结构。真的吗?

另外,bean和普通类之间是否存在实数差异?有没有特殊的定义或界面?

基本上,为什么会有这样的术语?

编辑:如果您能够如此友好并添加有关“可序列化”界面的信息,以及它的含义,请回答,我将非常感激。


#1 热门回答(1460 赞)

一个JavaBean只是一个standard

  • 所有属性私人(使用getters / setters)
  • 公共无参数构造函数
  • 实现可序列化。

而已。这只是一个惯例。尽管如此,许多图书馆依赖于它。

关于Serializable,来自API documentation

通过实现java.io.Serializable接口的类来启用类的可序列化。没有实现这个接口的类将不会有任何状态序列化或反序列化。可序列化类的所有子类本身都是可序列化的。序列化接口没有方法或字段,仅用于识别可序列化的语义。

换句话说,可序列化的对象可以写入流中,因此可以写入文件,对象数据库,任何事情。

此外,JavaBean和另一个类之间没有语法上的区别 - 一个类如果遵循标准定义了一个JavaBean。

这里有一个术语,因为该标准允许库以编程方式对您以预定义方式定义的类实例执行操作。例如,如果一个库想要传入任何你传入的对象,它就知道它可以,因为你的对象是可序列化的(假设lib需要你的对象是适当的JavaBean)。


#2 热门回答(236 赞)

有一个术语让它听起来很特别。现实远不如此神秘。

基本上,一个“豆”:

  • 是一个可序列化的对象(也就是说,它实现了java.io.Serializable,并且是正确的)
  • 具有“属性”,其getter和setter只是具有某些名称的方法(比如说,getFoo()是“Foo”属性的getter),并且
  • 具有公共默认构造函数(因此可以随意创建并通过设置其属性进行配置)。

更新:

至于Serializable:这只不过是一个“标记接口”(一个不声明任何函数的接口),它告诉Java实现类同意(并且暗示它能够)“序列化” - 一个将实例转换为字节流的过程。这些字节可以存储在文件中,通过网络连接等发送,并且有足够的信息允许JVM(至少知道该对象的类型)稍后重建对象 - 可能在不同的实例中应用程序,甚至在整个其他机器!

当然,为了做到这一点,班级必须遵守某些限制。其中最主要的是所有实例字段必须是原始类型(int,bool等),某些类的实例也是可序列化的,或者标记为“transient”,以便Java不会尝试包含它们。 (这当然意味着`transient'字段将不能在流中跳过。具有'transient'字段的类应该准备在必要时重新初始化它们。)

一个不能遵守这些限制的类不应该实现Serializable(而且,IIRC,Java编译器也不会这样做。)


#3 热门回答(79 赞)

JavaBeans是坚持一种非常简单的编码惯例的Java类。你所要做的就是

  • 实现java.io.Serializable接口 - 保存对象的状态
  • 使用公共的空参数构造函数 - 实例化对象
  • 并提供公共getter和setter方法 - 获取和设置私有变量(属性)的值。

原文链接