什么是javabean?

ct2axkht  于 2021-08-20  发布在  Java
关注(0)|答案(12)|浏览(277)

我认为,我理解“bean”是一个具有属性和getter/setter的java类。据我所知,它相当于c结构。这是真的吗?
此外,bean和常规类之间是否存在真正的语法差异?是否有任何特殊的定义或接口?
基本上,为什么会有这样一个术语?
还有什么是 Serializable 接口是什么意思?

drnojrws

drnojrws1#

java bean是一个java类(概念),应该遵循以下约定:
它应该有一个无参数构造函数。
它应该是可序列化的。
它应该提供设置和获取属性值的方法,称为getter和setter方法。
它是一个可重用的软件组件。它可以将多个对象封装到一个对象中,以便可以从多个位置访问同一个对象,这是朝着

kb5ga3dv

kb5ga3dv2#

javabean只是一个标准
所有属性都是私有的(使用getter/setter)
公共无参数构造函数
工具 Serializable .
就这样。这只是一个惯例。但很多图书馆都依赖它。
关于 Serializable ,来自api文档:
类的可序列化性由实现java.io.serializable接口的类启用。未实现此接口的类的任何状态都不会序列化或反序列化。可序列化类的所有子类型本身都是可序列化的。序列化接口没有方法或字段,仅用于标识可序列化的语义。
换句话说,可以将可序列化对象写入流,从而写入文件、对象数据库等任何内容。
另外,javabean和另一个类之间没有语法上的区别——如果一个类遵循标准,那么它就是javabean。
它有一个术语,因为该标准允许库以编程方式使用预定义的方式定义的类示例进行操作。例如,如果一个库想要流式传输您传递给它的任何对象,它知道它可以,因为您的对象是可序列化的(假设库要求您的对象是正确的javabeans)。

xv8emn3q

xv8emn3q3#

有一个术语让它听起来很特别。事实远非如此神秘。
基本上是“豆子”:
是一个可序列化对象(即,它实现 java.io.Serializable ,并且这样做是正确的)
具有“属性”,其getter和setter只是具有特定名称的方法(例如, getFoo() 是“foo”属性的getter),并且
具有公共零参数构造函数(因此可以随意创建并通过设置其属性进行配置)。
至于 Serializable :这只是一个“标记接口”(不声明任何函数的接口),它告诉java实现类同意(并暗示它能够)“序列化”——一个将示例转换为字节流的过程。这些字节可以存储在文件中,通过网络连接发送,等等,并且有足够的信息允许jvm(至少,知道对象类型的jvm)稍后重构对象——可能在应用程序的不同示例中,甚至在整个其他机器上!
当然,为了做到这一点,班级必须遵守某些限制。其中最主要的是,所有示例字段必须要么是基本类型(int、bool等),要么是某个类的示例,该类也是可序列化的,或者标记为 transient 这样java就不会试图包含它们(这当然意味着 transient 田野在穿越溪流时将无法生存。一个拥有 transient 如有必要,字段应准备好重新初始化。)
不能遵守这些限制的类不应该实现 Serializable (而且,iirc,java编译器甚至不允许它这么做。)

0qx6xfy6

0qx6xfy64#

javabeans是遵循极其简单的编码约定的java类。你所要做的就是
实施 java.io.Serializable 接口-保存对象的状态
使用公共空参数构造函数-示例化对象
提供公共getter/setter方法-获取和设置私有变量(属性)的值。

cbeh67ev

cbeh67ev5#

javabean的属性
javabean是满足某些编程约定的java对象:
javabean类必须实现 SerializableExternalizable 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;
   }
}
yzckvree

yzckvree6#

举例说明。
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;
    }
}
wj8zmpe1

wj8zmpe17#

java bean用于更少的代码和更多的工作方法。。。
JavaBean作为运行时发现和访问的通用契约在整个JavaEE中使用。例如,JavaServerPages(jsp)使用JavaBean作为页面之间或servlet与jsp之间的数据传输对象。JavaEE的javabeans激活框架使用javabeans将对mime数据类型的支持集成到JavaEE中。java EE管理API使用JavaBeans作为在java EE环境中管理资源的基础。
关于序列化:
在对象序列化中,对象可以表示为字节序列,其中包括对象的数据以及有关对象类型和对象中存储的数据类型的信息。
将序列化对象写入文件后,可以从文件中读取该对象并进行反序列化,也就是说,可以使用表示该对象及其数据的类型信息和字节在内存中重新创建该对象。

ebdffaop

ebdffaop8#

在跨多个服务器部署项目时,您会发现序列化非常有用,因为bean将在多个服务器之间持久化和传输。

qmb5sa22

qmb5sa229#

javabeans是一个标准,它的基本语法要求已经在其他答案中得到了明确的解释。
然而,依我看,它不仅仅是一个简单的语法标准。javabeans的真正含义或预期用途是,与围绕标准的各种工具支持一起,促进代码重用和基于组件的软件工程,即使开发人员能够通过组装现有组件(类)而无需编写任何代码(或只需编写一点粘合代码)来构建应用程序。不幸的是,行业对这项技术的估计和利用率都很低,这可以从本文的答案中看出。
如果您阅读了oracle关于javabeans的教程,就可以更好地理解这一点。

w9apscun

w9apscun10#

关于bean概念的一点背景/更新。许多其他答案实际上都有“是什么”的答案,但没有那么多“为什么”的答案。
它们是在java早期作为构建GUI的一部分而发明的。它们遵循易于工具分离的模式,允许它们创建属性面板,以便您可以编辑bean的属性。通常,bean属性表示屏幕上的控件(想想x、y、宽度、高度、文本等等)
您还可以将其视为强类型数据结构。
随着时间的推移,这些工具对于使用相同访问类型的许多工具变得非常有用(例如,hibernate将数据结构持久化到数据库)
随着工具的发展,它们更多地转向注解,而不是分离setter/getter名称。现在大多数系统不需要bean,它们可以使用任何带有注解属性的普通旧java对象来告诉它们如何操作它们。
现在我将bean视为带注解的属性球——它们实际上只对它们携带的注解有用。
豆子本身不是一种健康的模式。它们本质上破坏了封装,因为它们将所有属性暴露给外部操作,并且在使用它们时,有一种倾向(决不是要求)创建代码来外部操作bean,而不是在bean内部创建代码(违反了“不要向对象索要其值,让一个对象为你做点什么”)。使用带有最少getter和no setter的带注解的POJO更能恢复oo封装,并具有不变性的可能性。
顺便说一句,当所有这些事情发生时,有人将这个概念扩展到了一种叫做企业JavaBeans的东西。这些是。。。不一样。而且它们非常复杂,以至于很多人觉得他们不理解整个bean概念,于是停止使用这个术语。我认为,这就是为什么您通常会听到被称为pojo的bean(因为每个java对象都是pojo,这在技术上是可以的,但是当您听到有人说pojo时,他们通常会想到遵循bean模式的东西)

4smxwvx5

4smxwvx511#

根据维基百科:
该类必须具有公共默认构造函数(不带参数)。这允许在编辑和激活框架内轻松示例化。
根据标准命名约定,必须使用get、set、is(可用于布尔属性而不是get)和其他方法(所谓的访问器方法和mutator方法)访问类属性。这允许在框架内轻松地自动检查和更新bean状态,其中许多框架包括用于各种类型属性的自定义编辑器。setter可以有一个或多个参数。
该类应该是可序列化的(这允许应用程序和框架以独立于vm和平台的方式可靠地保存、存储和恢复bean的状态。)
有关更多信息,请点击此链接。

qnakjoqk

qnakjoqk12#

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

相关问题