[Java工程实践] 1.Java常用概念:Bean

摘要:
所有JavaBeans都是POJOs,而不是所有POJOsareJavaBeans。Java语言缺少属性、事件和多个继承函数。JavaBeans是编写这种粘合代码的惯用模式或惯例。用法如下:JavaIntListmyList=newJavaIntList();System.out。打印ln;JavaIntList的作者很满意,于是他打开了java int list库1.0版。发布后,原始的java int list_1.0.jar的用户已经升级到2.0版。这个publicintgetSize(){returnsize;}JavaBeans是使用JavaBeans的常用方法。现在是2014年。像C#和Scala这样的新的面向对象语言提供了满足这些常见需求的语言特性,因此不需要JavaBeans这样乏味的约定。因此,只要Scala程序不考虑与Java的交互,它们通常不需要JavaBeans这样的约定。

一、Java Bean基本概念:

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

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

All JavaBeans are POJOs but not all POJOs are JavaBeans.

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 Lambda    
作者:Mingqi
链接:https://www.zhihu.com/question/20125256/answer/324121308
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 JAVA后台开发岗位:

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

JAVA应用开发:

现在基本等同于Android开发,如果现在没在一个稳定的Android团队的话,在如今时间点(2017年)不建议学习了。(尝试一下也是可以的,谢绝撕逼)

JAVA后台开发:

1、算法:

各种排序 (Java常用排序算法/程序员必须掌握的8大排序算法 - 續寫經典 - 博客频道 - CSDN.NET)、查找(常用查找算法的Java实现 - 一步一步学Java - ITeye技术网站)、bitmap(海量数据解决思路之BitMap - 蚂蚁 - 51CTO技术博客)、字符串存储和处理(KMP字符串模式匹配算法Java实现 - 简书)等基础中的基础算法,这些面试时是一定要问的,所以一定要刷好,LeetCode Online Judge

2、JAVA se,JAVA 8特性,RxJAVA

JAVAse没什么好说的,找本书看看就ok。也可以先看看这个图感受一下:

[Java工程实践] 1.Java常用概念:Bean第2张(图片来自:What are the concepts every Java programmer must know?

一张图看懂JAVA8要学什么:

[Java工程实践] 1.Java常用概念:Bean第4张

3、设计模式:《Java设计模式 (豆瓣)》,或者其他的设计模式书翻翻就ok了,学设计模式并不是让你套各种模式写代码,而是为了让你能看懂别人写代码的套路(毕竟很多JAVA程序员以会各种模式为荣)

[Java工程实践] 1.Java常用概念:Bean第6张

4、AOP(什么是面向切面编程AOP? - Java - 知乎),动态代理(Java的动态代理(dynamic proxy)),注解(Java基础之理解Annotation - 宁 静 致 远 - 博客园):这部分一定要多找些资料看和多实践,JAVA比较死板,也只有这部分能玩一些HOOK类的黑魔法了。

[Java工程实践] 1.Java常用概念:Bean第8张

5、内存模型(深入理解Java内存模型(一)——基础 )、GC算法、JVM调优(JVM 优化经验总结):前两个找工作时候是一定要熟的,面试会盯着这一块问。最后一个实践中会用到,当然面试也会问。参考书籍,周志明老师的《深入理解Java虚拟机(第2版) (豆瓣)

[Java工程实践] 1.Java常用概念:Bean第10张(Java (JVM) Memory Model - Memory Management in Java - JournalDev)

GC算法(深入理解 Java 垃圾回收机制):

  • 引用计数法[Java工程实践] 1.Java常用概念:Bean第12张
  • 根搜索算法[Java工程实践] 1.Java常用概念:Bean第14张
  • 现代虚拟机中的垃圾搜集算法:
  1. 标记-清除[Java工程实践] 1.Java常用概念:Bean第16张
  2. 复制算法(新生代)
  3. 标记-压缩(老年代)[Java工程实践] 1.Java常用概念:Bean第18张
  • 分代收集

6、Concurrent(java.util.concurrent (Java Platform SE 7 ))和nio(java.nio (Java Platform SE 7 ))这两个package里面的类要会熟练用

7、要会用主流的日志系统,后台需要大量日志要追溯崩溃点,可以看看log4j(Log4j - Log4j 2 Guide - Apache Log4j 2)。

8、对于网络编程就是多接触框架了,比如Protobuf协议(https://developers.google.com/protocol-buffers/)、dubbo RPC框架(User Guide-zh - Dubbo - Alibaba Open Sesame),Netty和Mina、thrift。可以一起学一下Redis,RabbitMQ这些常用的message broker。

9、如果对大数据感兴趣,就学一下Spark(https://spark.apache.org/

上述只是保证你找到一个比较好工作的基本要求,学完这些后,你就可以按照自己兴趣点来点技能树了~

免责声明:文章转载自《[Java工程实践] 1.Java常用概念:Bean》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇聪明的木匠 (哈夫曼树)安装VMware Tools的步骤下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

IOC容器的初始化

1、BeanFactory   Spring Bean 的创建是典型的工厂模式,这一系列的Bean 工厂,也即IOC 容器为开发者管理对象间的依赖关系提供了很多便利和基础服务,在Spring 中有许多的IOC 容器的实现供用户选择和使用,其相互关系如下:     其中BeanFactory 作为最顶层的一个接口类,它定义了IOC 容器的基本功能规范,Bea...

目标检测算法的历史及分类

  随着人工智能的兴起,目标检测算法在各行业中起的作用越来越大,怎么落地,这是一个非常严峻的话题。今天看到一位大牛的分享,学习了。 把该领域的算法和历史做个梳理。方便后续研究。   按照时间分类,可以把该算法分成两类:传统算法和CCN算法。  传统算法: 级联分类器框架:Haar/LBP/积分HOG/ACF feature+Adaboost 级联分类器最...

【计算机组成原理】:存储系统学习(上)

一、程序的运行 冯诺依曼机的运行大致可分为两个步骤,存储程序和程序控制。具体而言,可分为以下步骤: (1)输入设备将程序与数据写入内存; (2)CPU取指令; (3)CPU执行指令期间读数据; (4)CPU写回运算结果; (5)输出设备输出结果。 二、存储系统层次结构 由于CPU和主存的运行速度相差较大,程序运行的速度就会受制于内存的速度。于是,存储系统...

【推荐系统实战】:C++实现基于用户的协同过滤(UserCollaborativeFilter)

好早的时候就打算写这篇文章,可是还是參加阿里大数据竞赛的第一季三月份的时候实验就完毕了。硬生生是拖到了十一假期。自己也是醉了。。。 找工作不是非常顺利,希望写点东西回想一下知识。然后再攒点人品吧,仅仅能如此了。 一、问题背景 二、基于用户的协同过滤算法介绍 三、数据结构和实验过程设计 四、代码 一、问题背景 首先介绍一下问题的背景。如今我有四个月的用户...

安全算法基础(一)

安全算法是算法的分支之一,还的依靠大量的数学基础进行计算,本文参照兜哥的AI安全样本对抗,做一个简单的算法安全概括,从零学习。 最新的安全算法对于我们常规的攻击样本检测,效果是不理想的,为了探究其原因,决定学习ai安全,神经网络。 常见的对抗样本的方法分为白盒,黑盒,以及真实世界物理攻击,难度依次递增。一下就照着书抄,一下几种方法的检测以及加固。 白盒攻击...

poj2349最小生成树prim算法

题目:有s个satellite channels,但有p(p>s)个地方,若任意两个地方有satellite channels,则无视该距离,并且剩余的地方只能与其他地方通过无线电连接,需要距离,且需要的距离只与最大距离有关,问该最大距离的最小值(大概是这样啦)分析:实际上就是求最小生成树中的第p-s大的数,可以先通过prim算法生成最小生成树,然后...