JavaBean是什么

Wesley13
• 阅读 646

作者:杨博
链接:https://www.zhihu.com/question/19773379/answer/31625054
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

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

然后发布了2.0版:java-int-list_2.0.jar。发布后,原有java-int-list_1.0.jar的用户纷纷升级版本到2.0。这些用户一升级,就发现自己的程序全部坏掉了,说是找不到什么size变量。于是这些用户就把作者暴打一顿,再也不敢用java-int-list库了。

这个故事告诉我们,如果不想被暴打致死,你就必须保持向后兼容性。太阳公司在设计Java语言时,也懂得这个道理。所以Java标准库中,绝对不会出现public int size这样的代码,而一定会一开始就写成:

private int size;
public int getSize() { return size; } 

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

现在是2014年,C#、Scala等比Java新的面向对象语言自身就提供了语言特性来实现这些常用需求,所以根本不需要Java Bean这样繁琐的约定。

比如,假如有个Scala版的ScalaIntList:

// 编译成 scala-int-list_1.0.jar
object ScalaIntList { final case class Node(next: Node, value: Int) } final class ScalaIntList { var head: ScalaIntList.Node = null var size: Int = 0 } 

用户这样用:

val myList = new ScalaIntList println(myList.size) 

有一天你心血来潮改成这样:

// 编译成 scala-int-list_2.0.jar
object ScalaIntList { final case class Node(next: Node, value: Int) } final class ScalaIntList { var head: ScalaIntList.Node = null final def size: Int = { var n = head var i = 0 while (n != null) { n = n.next i++ } i } } 

用户还是照样能用,根本不破坏向后兼容性。所以Scala程序只要不考虑和Java交互,一般就不需要类似Java Bean这样的约定。

顺便说一句,向后兼容性分为源代码级和二进制级,Scala的var或val改为final def的话,无论源代码级的向后兼容性,还是二进制级的向后兼容性,都不遭受破坏。但C#的字段改为属性的话,虽然不破坏源代码级的向后兼容性,但是会破坏二进制级的向后兼容性。这是C#的设计缺陷,导致微软的编码规范不得不禁止使用公有字段。

点赞
收藏
评论区
推荐文章
待兔 待兔
3个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
JDK15正式发布,新增功能预览!
!(https://oscimg.oschina.net/oscnet/6bd2a6635f22440998d62c58d1c4a7ad.jpg)作者|王磊来源|Java中文社群(ID:javacn666)转载请联系授权(微信ID:GG\_Stone)JDK15在2020年9月15号正式发布了,这次发布的主
Wesley13 Wesley13
3年前
JDK 竟然是这样实现栈的?
!(https://oscimg.oschina.net/oscnet/b2e60191f9d143e3a4899c717aa4cd2f.jpg)作者|王磊来源|Java中文社群(ID:javacn666)转载请联系授权(微信ID:GG\_Stone)前面的文章《动图演示:手撸堆栈的两种实现方法!》(https://w
Stella981 Stella981
3年前
Python3《机器学习实战》学习笔记(八):支持向量机原理篇之手撕线性SVM
转载请注明作者和出处:https://zhuanlan.zhihu.com/mljack机器学习知乎专栏:https://zhuanlan.zhihu.com/mljackCSDN博客专栏:http://blog.csdn.net/column/details/16415.htmlGithub代码获取:https://github.c
Wesley13 Wesley13
3年前
URL 去重的 6 种方案!(附详细代码)
!(https://oscimg.oschina.net/oscnet/424625a47398436aab01436e33af14d0.png)作者|王磊来源|Java中文社群(ID:javacn666)转载请联系授权(微信ID:GG\_Stone)URL去重在我们日常工作中和面试中很常遇到,比如这些:!(ht
Stella981 Stella981
3年前
Socket粘包问题终极解决方案—Netty版(2W字)!
!(https://oscimg.oschina.net/oscnet/f7f8847276f74c4785a2bb44a2405092.png)作者|王磊来源|Java中文社群(ID:javacn666)转载请联系授权(微信ID:GG\_Stone)上一篇我们写了《Socket粘包问题的3种解决方案(https://
Stella981 Stella981
3年前
2018java面试集合
作者:刘成链接:https://www.zhihu.com/question/266822548/answer/317700943来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。另一个java后端面试总结:http://www.cnblogs.com/java1024/p/7685400.html39
可莉 可莉
3年前
2018java面试集合
作者:刘成链接:https://www.zhihu.com/question/266822548/answer/317700943来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。另一个java后端面试总结:http://www.cnblogs.com/java1024/p/7685400.html39
Wesley13 Wesley13
3年前
Java中的5大队列,你知道几个?
!(https://oscimg.oschina.net/oscnet/413dba940d7047ee828abcda51d24e4a.jpg)作者|王磊来源|Java中文社群(ID:javacn666)转载请联系授权(微信ID:GG\_Stone)本文已收录至https://github.com/vipstone
Wesley13 Wesley13
3年前
mysql性能优化思考
作者:恒小发链接:https://www.zhihu.com/question/19719997/answer/574410444来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 分表我们前面有提到过对于mysql,其数据文件是以文件形式存储在磁盘上的。当一个数据文件过大时,操作系统对大文件