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

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

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

Serializable接口是什么意思?


当前回答

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;
   }
}

其他回答

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

如果您熟悉C/Golang,您从未听说过Cbean或Gobean,因为它们有struct关键字,开发人员可以轻松定义结构类型,而无需编写复杂的OOP关键字。

type User struct {
  Name string
  Age int
}

var user User

user.Name = "name"
user.Age = 18

var bytes, err = json.Marshal(user)

缺少结构类型是Java的错误,开发人员发现了这种严重的不足。

然后,JavaBean被发明为另一个无聊的规则,让类假装结构,让你的编辑器或编译器不会因为你对类成员的不安全访问而哭泣或大叫。

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

基本上,一个“憨豆”:

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

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

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

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

举例说明。

1.导入java.io.Serializable

关于序列化,请参阅文档。

2.私人领域

字段应该是私有的,以防止外部类轻易修改这些字段。通常使用getter/setter方法,而不是直接访问这些字段。

3.施工人员

没有任何参数的公共构造函数。

4.吸气器/设置器

用于访问和修改私有字段的Getter和setter方法。

/** 1. import java.io.Serializable */
public class User implements java.io.Serializable {
    /** 2. private fields */
    private int id;
    private String name;

    /** 3. Constructor */
    public User() {
    }
    public User(int id, String name) {
        this.id = id;
        this.name = name;
    }

    /** 4. getter/setter */
    // getter
    public int getId() {
        return id;
    }
    public String getName() {
        return name;
    }
    // setter
    public void setId(int id) {
        this.id = id;
    }
    public void setName(String name) {
        this.name = name;
    }
}

JavaBean是JavaBeans体系结构中的一个组件或基本构建块。JavaBeans体系结构是一种组件体系结构,它受益于基于组件的方法的可重用性和互操作性。

有效的组件体系结构应允许程序从软件构建块(在本例中为Beans),可能由不同的供应商提供,也使架构师/开发人员能够选择组件(Bean),了解其功能,并将其合并到应用程序中。

因为类/对象是像Java这样的OOP语言的基本构建块,所以它们是JavaBeans体系结构中Bean的自然竞争者。

将普通Java类转换为Javabean的过程实际上只不过是使其成为可重用和可互操作的组件。这将转化为具有以下功能的Java类:

控制向其他应用程序公开的类的财产、事件和方法。(您可以有一个BeanInfo类,它只报告外部应用程序需要的那些财产、事件和方法。)持久性(可串行化或可外部化-这也意味着没有参数构造函数,对字段使用瞬态)注册事件和生成事件的能力(例如,使用绑定和约束财产)定制器(通过GUI或提供文档来定制Bean)

为了将Java类称为Javabean,它们不需要具备上述所有能力。相反,它意味着实现上述与上下文相关的子集(例如,某个框架中的bean可能不需要自定义程序,其他一些bean可能并不需要绑定和约束的财产,等等)

为了获得上述好处,Java中几乎所有领先的框架和库都隐式地遵循JavaBeans体系结构。