究竟什么是 JavaBean?

问:

我认为,我理解“Bean”是具有属性和 getter/setter 的 Java 类。 据我所知,它相当于 C struct。真的吗?

此外,JavaBean 和常规 class 之间是否存在真正的句法差异? 是否有任何特殊定义或Interface?

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

另外 Serializable 接口是什么意思?

答1:

与HuntsBot一起,探索全球自由职业机会–huntsbot.com

JavaBean 只是一个 standard。它是一个常规的 Java class,但它遵循某些约定:

所有属性都是私有的(使用 getter/setter) 一个公共的无参数构造函数实现 Serializable。

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

关于 Serializable,来自 API documentation:

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

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

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

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

就在我看来,几乎所有围绕 bean 的文档都无法像您所拥有的那样简洁地描述该术语。 +1

bean 的成员是否也必须是 bean?似乎是一个合理的要求..

@worldsayshi - 不,这不是必需的。例如,一个 bean 可以包含一个字符串;并且 String 不是 bean。 (String 是不可变的,因此您不能通过调用空构造函数和 setter 来创建它。) Serializable 对象应该具有 Serializable 成员似乎是合理的,除非它以某种方式从外部序列化它们。所以不,Java bean 成员不需要具有 Java bean 的任何方面。尽管如果它们也是豆类,则更简单。

“所有属性私有”是不正确的。从 getter 和 setter 推断属性(如果有方法 X getFoo() -> bean 有一个名为“foo”的可读属性;如果有一个方法 setFoo(X foo) -> bean 有一个名为“富”)。属性可以由通常是私有的成员字段(但不一定是)支持。

我希望成为一个 Java bean “一个类必须是公共的”。它真的需要实现可序列化接口吗?

答2:

huntsbot.com全球7大洲远程工作机会,探索不一样的工作方式

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

基本上,一个“豆子”:

是一个可序列化的对象(也就是说,它实现了 java.io.Serializable,并且这样做是正确的),即

具有“属性”,其 getter 和 setter 只是具有特定名称的方法(例如,getFoo() 是“Foo”属性的 getter),并且

有一个公共的零参数构造函数(因此可以随意创建并通过设置其属性进行配置)。

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

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

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

这可能是一个愚蠢的问题,但是,除了原始类型或类的实例之外,实例字段还能是什么?

@kingfrito_5005:这将是一个或另一个。但是,如果它是一个类的实例,那么该类是否可序列化就很重要。为了使一个类可序列化,它的非 transient 部分必须是某种可序列化的类型。

可能忘了提到构造函数应该没有参数。有一个公共的默认构造函数(因此可以随意创建并通过设置其属性进行配置)。

@AmosKosgei:没有忘记;这只是多余的。根据定义,可以不带参数调用默认构造函数。

@Amos:不过,当我研究它时,似乎“默认构造函数”在 Java 中与 C++ 中的含义略有不同。 :P 将“默认”替换为“0-arg”。

答3:

打造属于自己的副业,开启自由职业之旅,从huntsbot.com开始!

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

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

保持自己快人一步,享受全网独家提供的一站式外包任务、远程工作、创意产品订阅服务–huntsbot.com

答4:

huntsbot.com全球7大洲远程工作机会,探索不一样的工作方式

JavaBean 的属性

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

JavaBean 类必须实现 Serializable 或 Externalizable JavaBean 类必须具有无参数构造函数 所有 JavaBean 属性必须具有公共 setter 和 getter 方法 所有 JavaBean 实例变量都应该是私有的

JavaBean 示例

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

注释是必需的还是 Java Bean 的一部分?

@giannischristofakis 不,注释不是必需的。注释是 Spring Framework 的一部分,它广泛使用 Java Bean。

为什么它需要一个无参数的构造函数?

@Renato 这很简单。想想 spring 必须使用 arg-constructor 自动实例化你的 bean ......它将作为参数传递什么? ;)

答5:

HuntsBot周刊–不定时分享成功产品案例,学习他们如何成功建立自己的副业–huntsbot.com

举例说明。

1.导入java.io.Serializable

至于序列化,参见documentation。

2.私有字段

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

3.构造函数

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

  1. 获取器/设置器

用于访问和修改私有字段的 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;
    }
}

我猜对于 setId(int id) 正文,您想说的是 this.id = id; 而不是 this.id = is;

答6:

保持自己快人一步,享受全网独家提供的一站式外包任务、远程工作、创意产品订阅服务–huntsbot.com

Java Beans 用于更少的代码和更多的工作方法…

Java Bean 在整个 Java EE 中用作运行时发现和访问的通用契约。例如,JavaServer Pages (JSP) 使用 Java Bean 作为页面之间或 servlet 和 JSP 之间的数据传输对象。 Java EE 的 JavaBeans 激活框架使用 Java Beans 将 MIME 数据类型的支持集成到 Java EE 中。 Java EE 管理 API 使用 JavaBeans 作为在 Java EE 环境中管理资源的基础。

关于序列化:

在对象序列化中,对象可以表示为一个字节序列,其中包括对象的数据以及有关对象类型和存储在对象中的数据类型的信息。

序列化的对象写入文件后,可以从文件中读取并反序列化,即表示对象及其数据的类型信息和字节可用于在内存中重新创建对象。

答7:

huntsbot.com汇聚了国内外优秀的初创产品创意,可按收入、分类等筛选,希望这些产品与实践经验能给您带来灵感。

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

您能否提供有关跨多个服务器部署项目的更多信息?谢谢你

比如说有几个服务器的集群,对于 Websphere,这个链接 stackoverflow.com/questions/3193345/… 可能会有所帮助。

答8:

huntsbot.com – 程序员副业首选,一站式外包任务、远程工作、创意产品分享订阅平台。

只是关于 bean 概念的一点背景/更新。许多其他答案实际上有什么但没有那么多为什么。

它们是早期在 Java 中作为构建 GUI 的一部分而发明的。他们遵循易于工具拆分的模式,让他们创建一个属性面板,以便您可以编辑 Bean 的属性。一般来说,Bean 属性代表屏幕上的一个控件(想想 x,y,width,height,text,…)

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

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

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

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

豆类本身并不是一种健康的模式。它们本质上破坏了封装,因为它们将所有属性暴露给外部操作,并且在使用它们时,有一种趋势(绝不是要求)创建代码以在外部操作 bean,而不是在 bean 内部创建代码(违反“don '不要向一个对象询问它的价值,而是要求一个对象为你做某事”)。使用带有最少 getter 且没有 setter 的带注释的 POJO 更能恢复封装并具有不变性的可能性。

顺便说一句,随着所有这些事情的发生,有人将这个概念扩展到了一种叫做 Enterprise Java Beans 的东西。这些是……不同的。而且它们足够复杂,以至于许多人觉得他们不了解整个 Bean 概念并停止使用该术语。我认为这就是为什么您通常会听到将 bean 称为 POJO 的原因(因为每个 Java 对象都是 POJO,这在技术上是可以的,但是当您听到有人说 POJO 时,他们通常会考虑遵循 bean 模式的东西)

正确 - 违反“不要向对象询问它的值,请对象为您做某事”)

答9:

huntsbot.com全球7大洲远程工作机会,探索不一样的工作方式

JavaBeans 是一个标准,其他答案已经清楚地解释了它的基本语法要求。

然而,IMO,它不仅仅是一个简单的语法标准。 JavaBeans的真正意义或预期用途是,与围绕标准的各种工具支持一起,促进代码重用和基于组件的软件工程,即使开发人员能够通过组装现有组件(类)来构建应用程序,而无需编写任何代码(或者只需要写一点胶水代码)。不幸的是,这项技术被业界低估和利用不足,这可以从这个线程的答案中看出。

如果您阅读 Oracle 的tutorial on JavaBeans,您可以对此有更好的理解。

有用的帖子和链接。当我想到 bean 时,我确实会想到“Visual Builder”类型的东西,如 Oracle 文章中所示。我想知道是否有许多其他框架大量使用它们......

而不是像 to facilitate code reuse and component-based software engineering, i.e. enable developers to build applications by assembling existing components (classes) and without having to write any code (or only have to write a little glue code). 这样的垃圾词,您可以举一个例子来说明“促进代码重用”的意思

答10:

huntsbot.com洞察每一个产品背后的需求与收益,从而捕获灵感

根据维基百科:

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

有关更多信息,请遵循此 link。

以前的答案不是已经涵盖了吗?

我很确定 OP(和我们大多数人)在这里是为了解释而不是复制粘贴文本

最有用的答案..我一直在寻找每个条件旁边的原因..我想我会停止在这里滚动..谢谢

答11:

HuntsBot周刊–不定时分享成功产品案例,学习他们如何成功建立自己的副业–huntsbot.com

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

原文链接:https://www.huntsbot.com/qa/2V02/what-is-a-javabean-exactly?lang=zh_CN&from=csdn

huntsbot.com洞察每一个产品背后的需求与收益,从而捕获灵感

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值