[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;
}
JavaIntList myList = new JavaIntList();
System.out.println(myList.size);
有一天,作者决定要节省内存,不要缓存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#的设计缺陷,导致微软的编码规范不得不禁止使用公有字段。链接: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 垃圾回收机制):
- 引用计数法
- 根搜索算法
- 现代虚拟机中的垃圾搜集算法:
- 标记-清除
- 复制算法(新生代)
- 标记-压缩(老年代)
- 分代收集
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/)
上述只是保证你找到一个比较好工作的基本要求,学完这些后,你就可以按照自己兴趣点来点技能树了~