究竟什么是 JavaBean?

新手上路,请多包涵

我认为,我理解“Bean”是具有属性和 getter/setter 的 Java 类。

据我了解,它相当于 C struct 。真的吗?

此外, JavaBean 和常规 class 之间是否存在真正的 语法 差异?

是否有任何特殊定义或 Interface

基本上,为什么有这个术语?

还有 Serializable 接口是什么意思?

原文由 Amir Rachum 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 715
2 个回答

JavaBean 只是一个 标准。它是一个普通的 Java class ,除了它遵循某些约定:

  1. 所有属性都是私有的(使用 getters/setters
  2. 公共 无参数构造函数
  3. 实现 Serializable

而已。这只是一个约定。很多图书馆都依赖它。

关于 Serializable ,来自 API 文档

类的可序列化性由实现 java.io.Serializable 接口的类启用。未实现此接口的类将不会对其任何状态进行序列化或反序列化。可序列化类的所有子类型本身都是可序列化的。序列化接口没有方法或字段,仅用于识别可序列化的语义。

换句话说,可序列化对象可以写入流,因此可以写入文件、对象数据库等等。

此外,JavaBean 和另一个类之间在语法上没有区别——如果一个类遵循标准,那么它就是一个 JavaBean。

它有一个术语,因为该标准允许库以编程方式处理您以预定义方式定义的类实例。例如,如果一个库想要流式传输您传递给它的任何对象,它知道它可以,因为您的对象是可序列化的(假设该库要求您的对象是正确的 JavaBeans)。

原文由 hvgotcodes 发布,翻译遵循 CC BY-SA 4.0 许可协议

有一个术语让它听起来很特别。现实远没有那么神秘。

基本上,一个“Bean”:

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

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

当然,为了做到这一点,类必须遵守某些限制。其中最主要的是所有实例字段必须是原始类型(int、bool 等)、某些也可序列化的类的实例,或者标记为 transient 这样 Java 就不会尝试包含他们。 (这当然意味着 transient 字段将无法通过流传输。具有 transient 字段的类应该准备好在必要时重新初始化它们。)

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

原文由 cHao 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题