当前位置:首页 > 技术知识 > 正文内容

每天学Java!Java Bean是什么概念(java bean有什么用)

maynowei8个月前 (08-05)技术知识145

对于初学Java,或者是刚接触J2EE的人来说,Java bean确实是一个不太好理解的概念,对于一些专业的解释呢,好像看起来也不是那么容易理解。所以小华君今天就准备跟大家说一说Java bean的概念。

按照专业一点的说法,Java bean是一种Java语言写成的可重用组件。为写成Java bean,类必须是具体的和公共的,并且具有无参数的构造器。Java bean通过提供符合一致性设计模式的公共方法将内部域暴露成员属性。属性名称符合这种模式,其他Java类可以通过自身机制发现和操作这些Java bean的属性。

我们通俗一点解释一下,也就是说Java bean是符合一定规范编写的Java类,不是一种技术,而是一种规范。大家针对这种规范,总结了很多开发技巧、工具函数。符合这种规范的类,可以被其它的程序员或者框架使用。事实上,Java bean首次发布是在1996年12月,目的就是为了通过统一的规范可以设置对象的值(get,set)方法。

在《Think in Java》一书中,作者提到了Java bean最初是为Java GUI的可视化编程实现的。拖动IDE构建工具创建一个GUI组件,其实是工具创建Java类并提供将类的属性暴露出来给你修改调整,将事件监听器暴露出来。

我们都知道,Java语言在属性、时间和多重继承功能方面做得并不好。程序员想在程序中实现一些面向对象编程的常见需求,只能手写大量胶水代码。而Java bean就是编写这套胶水代码的惯用模式或约定。当类遵守了这些约定时就可以用于若干工具或库,这些约定包括getXxx、setXxx、isXxx、addXxxListener、XxxEvent等。

我们还是举个栗子来看一下。比如你要用Java实现一个单向链表类,你可能会这样写:

// 编译成 java-int-list_1.0.jar

public final class JavaIntList {

static class Node {

public Node next;

public int value;

}

public Node head;

public int size;

}

上述实现为了能够快速获取链表的大小,把链表的大小缓存在size变量中,会采用这种用法:

JavaIntList myList = new JavaIntList();

System.out.println(myList.size);

JavaIntList的作者很满意,于是开源了java-int-list库的1.0版。文件名是java-int-list_1.0.jar。发布后,吸引了许多用户来使用java-int-list_1.0.jar。

有一天,你突然决定要节省内存,不要缓存size变量了,就把代码改成了这样:

// 编译成 java-int-list_2.0.jar

public final class JavaIntList {

static final class Node {

public Node next;

public int value;

}

public Node head;

public int getSize() {

Node n = head;

int i = 0;

while (n != null) {

n = n.next;

i++;

}

return i;

}

}

然后发布了java-int-list_2.0.jar。发布后,原有java-int-list_1.0.jar的用户纷纷升级版本到2.0。这些用户一升级,就发现自己的程序全部坏掉了,说是找不到什么size变量。然后用户都被你气炸了,说再也不用你写的东西了。

所以为了保持你写的东西能够有人用,你就必须保持向后兼容性。太阳公司在设计Java语言时,也懂得这个道理。在Java标准库中,绝对不会出现public int size这样的代码,而一定会一开始就写成:

private int size;

public int getSize() { return size; }

这让用户一开始就使用getSize,以便有朝一日修改getSize实现时,不破坏向后兼容性。这种public int getSize() { return size; }的惯用手法,就是Java bean。

(内容整理自知乎)

相关文章

Go 语言中的 RWMutex 源码解析、使用场景及应用分析

Go 语言标准库的 sync 包提供了一些非常重要的并发原语来帮助程序开发者处理并发任务。本文将详细解析 sync 包中的 RWMutex,即读写互斥锁(Reader/Writer Mutex),并结...

Go语言进阶:时间轮(golang时间轮)

时间轮概念时间轮(Timing Wheel)是一种高效的定时任务调度数据结构,特别适合处理大量定时任务。它通过一个循环数组(轮盘)和多个槽位(buckets)来组织定时任务,每个槽位代表一个时间间隔。...

如何在Go中同步线程(go语言同步锁)

单线程代码已经带来头痛。添加第二个线程,就是从基础头痛升级了。解决方案?互斥锁:线程和数据的交通警察。一旦你理解了它们,线程同步就变成了第二本能,语言无关。在C++和Go中工作,我遇到过所有常见的混乱...

不需安装oracleclient连接oracle数据库方案

在Oracle官方发布ODP.net之前,我们通常使用微软的System.data.OracleClient进行Oracle数据库操作,它的缺点是必须要装Oracle客户端OracleClient,如...

LabVIEW实现Oracle数据库的访问(labview数据库查询界面)

1. 安装 Oracle 客户端下载:从 Oracle 官方网站下载适用于 Windows 操作系统的 Oracle 驱动程序。确保下载的版本与 LabVIEW 环境和操作系统兼容。1)以 Windo...

Oracle又双叕开始严查JDK,连夜提桶跑路

哈佛商业报道了最近几起北美的JDK许可问题公司用了来源不明的JDK,怕蹲里面,连夜提桶跑路The company uses JDK from unknown sources, and is afrai...