我认为,我理解“Bean”是一个具有财产和getters/setter的Java-class。据我所知,它相当于C结构。这是真的吗?

此外,JavaBean和常规类之间是否存在真正的语法差异?是否有特殊定义或接口?

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

Serializable接口是什么意思?


当前回答

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

基本上,一个“憨豆”:

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

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

当然,为了做到这一点,班级必须遵守某些限制。其中最主要的是,所有实例字段必须要么是原始类型(int、bool等),要么是某些类的实例,也可以是可序列化的,要么标记为瞬时的,这样Java就不会试图包含它们。(这当然意味着瞬态字段将无法在流上运行。如果需要,具有瞬态字段的类应该准备好重新初始化它们。)

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

其他回答

JavaBean的财产

JavaBean是满足某些编程约定的Java对象:

JavaBean类必须实现Serializable或可外部化JavaBean类必须具有无参数构造函数所有JavaBean财产都必须具有公共setter和getter方法所有JavaBean实例变量都应该是私有的

JavaBeans示例

@Entity
public class Employee implements Serializable{

   @Id
   private int id;
   private String name;   
   private int salary;  

   public Employee() {}

   public Employee(String name, int salary) {
      this.name = name;
      this.salary = salary;
   }
   public int getId() {
      return id;
   }
   public void setId( int id ) {
      this.id = id;
   }
   public String getName() {
      return name;
   }
   public void setName( String name ) {
      this.name = name;
   }
   public int getSalary() {
      return salary;
   }
   public void setSalary( int salary ) {
      this.salary = salary;
   }
}

JavaBeans是遵循极其简单的编码约定的Java类。你所要做的就是

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

关于问题的第二部分,序列化是一种持久性机制,用于将对象存储为一系列带符号的字节。不太正式地说,它存储对象的状态,以便以后可以通过反序列化来检索它。

只是关于bean概念的一些背景/更新。许多其他答案实际上都有其原因,但没有那么多原因。

它们是在Java早期作为构建GUI的一部分而发明的。他们遵循的模式很容易被工具拆开,让他们创建一个财产面板,这样您就可以编辑Bean的属性。通常,Bean财产表示屏幕上的控件(想想x、y、宽度、高度、文本…)

您也可以将其视为强类型数据结构。

随着时间的推移,这些工具对于使用相同类型访问的许多工具变得有用(例如,Hibernate将数据结构持久化到数据库)

随着工具的发展,它们更多地转向注释,而不是分离setter/getter名称。现在大多数系统都不需要bean,它们可以使用任何带注释财产的普通旧Java对象来告诉它们如何操作它们。

现在我将bean视为带注释的属性球——它们只对它们所携带的注释有用。

豆类本身并不是一种健康的模式。由于它们将所有财产暴露给外部操作,因此它们本质上破坏了封装,并且在使用它们时,有一种趋势(绝非要求),即创建代码以外部操作bean,而不是在bean内创建代码(违反了“不要求对象提供其值,要求对象为您做一些事情”)。使用带有最小getter和无setter的带注释POJO更像是OO还原封装,并且具有不变性的可能性。

顺便说一句,当所有这些事情发生时,有人将这个概念扩展到了名为EnterpriseJavaBeans的东西上。这些是。。。不同的它们非常复杂,以至于许多人觉得他们不理解整个Bean概念,并停止使用这个术语。我想,这就是为什么你通常会听到bean被称为POJO(因为每个Java对象都是POJO,这在技术上是可以的,但当你听到某人说POJO时,他们通常会想到遵循bean模式的东西)

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

基本上,一个“憨豆”:

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

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

当然,为了做到这一点,班级必须遵守某些限制。其中最主要的是,所有实例字段必须要么是原始类型(int、bool等),要么是某些类的实例,也可以是可序列化的,要么标记为瞬时的,这样Java就不会试图包含它们。(这当然意味着瞬态字段将无法在流上运行。如果需要,具有瞬态字段的类应该准备好重新初始化它们。)

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