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

一、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。也可以先看看这个图感受一下:

 

(图片来自:What are the concepts every Java programmer must know?

 

一张图看懂JAVA8要学什么:


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

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

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

 

(Java (JVM) Memory Model - Memory Management in Java - JournalDev)

 

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

  • 引用计数法
  • 根搜索算法
  • 现代虚拟机中的垃圾搜集算法:
  1. 标记-清除
  2. 复制算法(新生代)
  3. 标记-压缩(老年代)
  • 分代收集

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协议()、dubbo RPC框架(User Guide-zh - Dubbo - Alibaba Open Sesame),Netty和Mina、thrift。可以一起学一下Redis,RabbitMQ这些常用的message broker。

9、如果对大数据感兴趣,就学一下Spark(

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

posted on 2020-05-02 18:03  ym65536  阅读(275)  评论(0编辑  收藏  举报