我认为,我理解“Bean”是一个具有财产和getters/setter的Java-class。据我所知,它相当于C结构。这是真的吗?
此外,JavaBean和常规类之间是否存在真正的语法差异?是否有特殊定义或接口?
基本上,为什么有一个术语?
Serializable接口是什么意思?
我认为,我理解“Bean”是一个具有财产和getters/setter的Java-class。据我所知,它相当于C结构。这是真的吗?
此外,JavaBean和常规类之间是否存在真正的语法差异?是否有特殊定义或接口?
基本上,为什么有一个术语?
Serializable接口是什么意思?
当前回答
JavaBean只是一个标准。它是一个常规的Java类,但它遵循某些约定:
所有财产都是私有的(使用getters/setter)公共无参数构造函数实现可序列化。
就是这样,这只是一个惯例。但许多图书馆都依赖它。
关于Serializable,请参阅API文档:
类的可序列化性由实现java.io.Serializable接口。不实现此功能的类接口将不会序列化或反序列化它们的任何状态。可序列化类的所有子类型本身都是可序列化的。这个序列化接口没有方法或字段,仅用于识别可序列化的语义。
换言之,可序列化对象可以写入流,因此可以写入文件、对象数据库等。
此外,JavaBean和另一个类之间没有语法差异——如果一个类遵循标准,那么它就是JavaBean。
这是一个术语,因为该标准允许库以编程方式处理您以预定义方式定义的类实例。例如,如果一个库想要流式传输您传递给它的任何对象,它知道可以这样做,因为您的对象是可序列化的(假设库要求您的对象为正确的JavaBeans)。
其他回答
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;
}
}
JavaBean是JavaBeans体系结构中的一个组件或基本构建块。JavaBeans体系结构是一种组件体系结构,它受益于基于组件的方法的可重用性和互操作性。
有效的组件体系结构应允许程序从软件构建块(在本例中为Beans),可能由不同的供应商提供,也使架构师/开发人员能够选择组件(Bean),了解其功能,并将其合并到应用程序中。
因为类/对象是像Java这样的OOP语言的基本构建块,所以它们是JavaBeans体系结构中Bean的自然竞争者。
将普通Java类转换为Javabean的过程实际上只不过是使其成为可重用和可互操作的组件。这将转化为具有以下功能的Java类:
控制向其他应用程序公开的类的财产、事件和方法。(您可以有一个BeanInfo类,它只报告外部应用程序需要的那些财产、事件和方法。)持久性(可串行化或可外部化-这也意味着没有参数构造函数,对字段使用瞬态)注册事件和生成事件的能力(例如,使用绑定和约束财产)定制器(通过GUI或提供文档来定制Bean)
为了将Java类称为Javabean,它们不需要具备上述所有能力。相反,它意味着实现上述与上下文相关的子集(例如,某个框架中的bean可能不需要自定义程序,其他一些bean可能并不需要绑定和约束的财产,等等)
为了获得上述好处,Java中几乎所有领先的框架和库都隐式地遵循JavaBeans体系结构。
有一个术语可以让它听起来很特别。现实远没有那么神秘。
基本上,一个“憨豆”:
是一个可串行化的对象(即,它实现java.io.serializable,并正确执行)具有“财产”,其getter和setter只是具有特定名称的方法(例如,getFoo()是“Foo”属性的getter),并且有一个公共的零参数构造函数(因此可以随意创建并通过设置其财产进行配置)。
至于Serializable:这只是一个“标记接口”(一个不声明任何函数的接口),它告诉Java实现类同意(并暗示它能够)“序列化”——一个将实例转换为字节流的过程。这些字节可以存储在文件中,通过网络连接等发送,并且具有足够的信息,允许JVM(至少是一个了解对象类型的JVM)稍后重建对象——可能在应用程序的不同实例中,甚至在整个其他机器上!
当然,为了做到这一点,班级必须遵守某些限制。其中最主要的是,所有实例字段必须要么是原始类型(int、bool等),要么是某些类的实例,也可以是可序列化的,要么标记为瞬时的,这样Java就不会试图包含它们。(这当然意味着瞬态字段将无法在流上运行。如果需要,具有瞬态字段的类应该准备好重新初始化它们。)
不能遵守这些限制的类不应该实现Serializable(而且,IIRC,Java编译器甚至不允许它这样做)
JavaBean只是一个标准。它是一个常规的Java类,但它遵循某些约定:
所有财产都是私有的(使用getters/setter)公共无参数构造函数实现可序列化。
就是这样,这只是一个惯例。但许多图书馆都依赖它。
关于Serializable,请参阅API文档:
类的可序列化性由实现java.io.Serializable接口。不实现此功能的类接口将不会序列化或反序列化它们的任何状态。可序列化类的所有子类型本身都是可序列化的。这个序列化接口没有方法或字段,仅用于识别可序列化的语义。
换言之,可序列化对象可以写入流,因此可以写入文件、对象数据库等。
此外,JavaBean和另一个类之间没有语法差异——如果一个类遵循标准,那么它就是JavaBean。
这是一个术语,因为该标准允许库以编程方式处理您以预定义方式定义的类实例。例如,如果一个库想要流式传输您传递给它的任何对象,它知道可以这样做,因为您的对象是可序列化的(假设库要求您的对象为正确的JavaBeans)。
JavaBeans用于更少的代码和更多的工作方法。。。
JavaBeans在整个JavaEE中被用作运行时发现和访问的通用契约。例如,JavaServerPages(JSP)使用JavaBeans作为页面之间或servlet和JSP之间的数据传输对象。Java EE的JavaBeans激活框架使用Java Beans将对MIME数据类型的支持集成到Java EE中。Java EE管理API使用JavaBeans作为在Java EE环境中管理的资源插入的基础。
关于序列化:
在对象序列化中,对象可以表示为一个字节序列,其中包括对象的数据以及关于对象类型和存储在对象中的数据类型的信息。
序列化对象写入文件后,可以从文件中读取并反序列化,也就是说,可以使用表示对象及其数据的类型信息和字节在内存中重新创建对象。