zoukankan      html  css  js  c++  java
  • [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(

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

  • 相关阅读:
    微软Silverlight团队关于PDC会议发表官方补充声明(风云翻译版)
    《银光志Silverlight 3.0开发详解与最佳实践》发行第三版总销量过万册
    Silverlight医学PACS诊断分析管理系统【案例分享】
    微软PDC10与最后的恐慌者
    风云的银光志Silverlight4.0教程之与学会使用Frame控件
    WPF案例之生产线控制器管理系统
    WindowsPhone7 经典3D游戏《刺客信条》评测
    Silverlight4开发的炫酷企业网站整站(运行大量特效)
    微软Windows Phone7超越Android、iOS的五大优势
    as3 滤镜学习笔记
  • 原文地址:https://www.cnblogs.com/ym65536/p/12818918.html
Copyright © 2011-2022 走看看