当前位置: 首页 > news >正文

【java】Java bean 是个什么概念?

Java bean 是一种规范:

Java Bean是基于社区共识形成的一套精确的规范。设计的原则之一是高内聚低耦合,不懂就别提其他的

1、所有属性为private
2、提供默认构造方法
3、提供getter和setter
4、实现serializable接口

   1.所有属性为private

     2.这个类必须具有一个公共的(public)无参构造函数(默认构造方法)

     3.private属性必须提供public的getter和setter来给外部访问,并且方法的命名也必须遵循一定的命名规范

     4.这个类是可序列化的,要实现serializable接口
原文链接:https://blog.csdn.net/qq_42245219/article/details/82748460

-----------------------------------------------------------------------------------

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#的设计缺陷,导致微软的编码规范不得不禁止使用公有字段。

原文:Java bean 是个什么概念? - 杨博的回答 - 知乎 https://www.zhihu.com/question/19773379/answer/31625054

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【web】Postman 使用教程详解
  • 【vue】vue项目结和start
  • 【vue】vue项目结构-2
  • 【vue】vue + springboot 简单登录代码
  • 【Maven 】Maven 错误 Failure to transfer ...was cached in the local repository...
  • 【Maven】Eclipse自带Maven增加setting.xml
  • 【springboot】springboot 错误集合
  • 【springboot】springboot 发布jar
  • 【springboot】springboot 注解
  • 【Vue】Vue项目开发目录结构和引用调用关系
  • 【RESTful API】SpringBoot RESTful API 架构风格实践
  • 【springboot】spring-boot + jdbc
  • 【Spring Boot 】Spring Boot Mybatis 使用教程
  • 【SpringBoot】Spring Boot 快速集成 Shiro 示例
  • 【模板引擎】什么会用到模板引擎?页面渲染选择thymeleaf模板引擎还是Vue?
  • Android Studio:GIT提交项目到远程仓库
  • Java Agent 学习笔记
  • Java 内存分配及垃圾回收机制初探
  • JavaScript中的对象个人分享
  • js面向对象
  • Less 日常用法
  • ucore操作系统实验笔记 - 重新理解中断
  • vue从创建到完整的饿了么(18)购物车详细信息的展示与删除
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  • 推荐一个React的管理后台框架
  • [Shell 脚本] 备份网站文件至OSS服务(纯shell脚本无sdk) ...
  • hi-nginx-1.3.4编译安装
  • Linux权限管理(week1_day5)--技术流ken
  • Spark2.4.0源码分析之WorldCount 默认shuffling并行度为200(九) ...
  • 国内开源镜像站点
  • ​queue --- 一个同步的队列类​
  • ​如何使用QGIS制作三维建筑
  • ‌前端列表展示1000条大量数据时,后端通常需要进行一定的处理。‌
  • #QT 笔记一
  • #数据结构 笔记三
  • $Django python中使用redis, django中使用(封装了),redis开启事务(管道)
  • (3)llvm ir转换过程
  • (55)MOS管专题--->(10)MOS管的封装
  • (Java岗)秋招打卡!一本学历拿下美团、阿里、快手、米哈游offer
  • (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  • (代码示例)使用setTimeout来延迟加载JS脚本文件
  • (二)Linux——Linux常用指令
  • (解决办法)ASP.NET导出Excel,打开时提示“您尝试打开文件'XXX.xls'的格式与文件扩展名指定文件不一致
  • (十六)Flask之蓝图
  • (算法)求1到1亿间的质数或素数
  • (原)本想说脏话,奈何已放下
  • (转载)深入super,看Python如何解决钻石继承难题
  • (转载)在C#用WM_COPYDATA消息来实现两个进程之间传递数据
  • (自用)网络编程
  • ./configure,make,make install的作用(转)
  • .bat批处理(五):遍历指定目录下资源文件并更新
  • .NET 2.0中新增的一些TryGet,TryParse等方法
  • .NET/C# 异常处理:写一个空的 try 块代码,而把重要代码写到 finally 中(Constrained Execution Regions)
  • .NET设计模式(8):适配器模式(Adapter Pattern)
  • .net下的富文本编辑器FCKeditor的配置方法