终于讲完了。你们或许会问,难道这十几讲就涵盖了Java的主要方面了吗?当然不是,有些很重要的内容我都没有提及,比如网络编程。我们的讲座不是编写教材,并不全面,主要是通过一些主题让大家对Java有一个进阶的理解。一开头我就说了,听众是相关专业毕业并有一年左右的Java编程基础的人。要看入门教科书和语言参考书,有很多选择,我决心不再走人的老路,我想结合自己的经历,为大家展示一位自认为Java布道者的理解。我的一系列讲座,从Java语言,到Web框架探索,到设计模式和算法,再到文本分析和自然语言理解,都是按照这个思路发展出来的。我不确定这种带有个人化的技术写作最后的命运是什么,但是这就是我的选择。
Java只是又一门语言吗?很多人刚接触的时候都会这么想,语言太多了。历史上大部分语言只是计算机的指令集,并不具有一门“语言”方面的系统性。随着问题变得愈大和愈复杂,不同表达方式的方便灵活以及局限会显露无遗。但是Java不同,不可将 Java 简单想象成一系列功能特性的集合,当在考虑“设计”、而非考虑简单的编码时,才可真正体会到Java 的强大。我认为Java能够跻身语言族中的一员,同人类任何语言一样,Java 为我们提供了一种表达思想的方式。
Java显著地减少了程序员开发程序的复杂性。并在长期的发展中,解决了重要的复杂任务,如多线程,网络编程,企业计算框架,最终解决了跨平台编程,动态代码和安全的任务。我们用Java来解决面对的问题时,都能从“举步维艰”到“起立鼓掌”。
Java体系,洋洋大观,自成一体。从最初的设备上的平台系统,不停迭代,参与和领导了互联网大潮、移动计算潮流、大数据浪潮、云计算浪潮。关键在于创始者Gosling他们登高望远,眼界宏大,立志为跨平台系统制定不拔之法则,终成数十年以来的名门正派。应了那句古诗:欲穷千里目,更上一层楼。

几十年以来,Java都一直受人欢迎,总是站立潮头。我想主要有几点,一,Java的语法纯粹,是典型的纯面向对象思想下产生的语言,因为纯粹,所以简单易于接受。二,Java不仅仅是一门语言,更重要的是一个生态,在重要的方面都有大量人员的支持和很好的解决方案,例如网络编程,企业后台编程,大数据处理,移动应用开发。三,Java的开发体系很完整,代码可维护性,编译时检查,较为高效率的运行效率,跨平台能力,丰富的 IDE,测试,项目管理工具配合。因此Java 语言的综合能力是最好的。

滚滚长江东逝水,浪花淘尽英雄。在Java历史轨迹上,镶嵌着一系列灿烂的巨星,我们来了解一下这些令人高山仰止的人物。
James Gosling 
出生于加拿大,在卡内基·梅隆大学攻读计算机博士学位时,他编写了多处理器版本的Unix操作系统。1991年,在Sun公司工作期间,高斯林和一群技术人员创建了一个名为Oak的项目,旨在开发运行于虚拟机的编程语言,同时允许程序在电视机机顶盒等多平台上运行。后来,这项工作就演变为Java。随着互联网的普及,尤其是网景开发的网页浏览器的面世,Java 成为全球流行的开发语言。因此被人称作Java之父。
但是在商业社会,Java之父也对Java的发展充满无力。在离开Oracle公司时写到,“我所说的都关乎细节与诚实,但吐露真相只会带来更多的坏处。”并称,“到处都是有关专利的争吵。律师们的眼睛闪闪发光。”最后James离开了Oracle,继而又离开了Google。去了一家海洋探测机器人的公司。也许在某个海岛,在远望星辰大海的某个地方,你能见到我们的上帝。
Bill Joy
生于1954年,1982年与Vinod Khosla, Scott McNealy和Andy Bechtolsheim一起创建了Sun Microsystems,担任首席科学家,直到2003年离开。他是一位令人崇敬的软件天才,他在软件和硬件的历史上留下了无数令人仰止的传奇。这个其貌不扬的瘦高个,有着凌乱的亚麻色头发,被誉为“软件行业的爱迪生”。在MIT的BBS上曾有一个帖子,问“Who do you think is the best coder, and why?”虽然回复的帖子中大家都声明列举的best coder排名不分先后,然而大多数人仍把Bill Joy列在第一位,或许可以从一个侧面验证Bill Joy在广大Programmer心目中的地位吧。
Joshua Bloch
1961年生人。哥伦比亚大学计算机科学专业学士学位,卡内基梅隆大学计算机科学专业博士学位。在Java刚浮出水面准备施展拳脚的时候,恰逢其时,Joshua Bloch来到了Sun,开始了他带领Java社区步入“迦南美地”的历程。Java每一个重要的版本中都留下了Joshua的手印,也是Java集合框架的创立者。有人说,假如将James Gosling比作Java之父,那么Joshua就是一手将Java 哺育成人的Java之母。他的大作《Effective Java》Java粉丝们一定耳熟能详。该书荣膺2002年度Jolt大奖。
Doug Lea
这个鼻梁挂着眼镜,留着德王威廉二世的胡子,脸上永远挂着谦逊腼腆笑容,服务于纽约州立大学Oswego分校计算机科学系的老大爷。两次Java历史上的大变革,他都间接或直接的扮演了举足轻重的角色。2004年所推出的Tiger。Tiger广纳了15项JSRs(Java Specification Requests)的语法及标准,其中一项便是JSR-166。JSR-166是来自于Doug编写的util.concurrent包。Doug是一个无私的人,他深知分享知识和分享苹果是不一样的,苹果会越分越少,而自己的知识并不会因为给了别人就减少了,知识的分享更能激荡出不一样的火花。他被称之为“对Java影响最大的人。”
Rod Johnson
Spring Framework创始人,著名作者。 Rod在悉尼大学获得了计算机学位,还获得了音乐博士学位。他是JSR-154(Servlet2.4)规范的专家。他看去是一个典型的英国绅士,虽然他出生在澳大利亚,但是现在住在伦敦。人尽皆知的故事就是Spring了。EJB是J2EE的核心技术之一,被称为皇冠上的明珠,而Rod Johnson一个人站起来宣称,根本不需要EJB,撼动了整个JavaEE,改变了历史潮流。Rod Johnson将会引领一种影响深远的潮流。但这潮流不是Spring和Hibernate,也不是IoC和AOP,甚至不是“轻量级架构”,而是一切实事求是的“循证架构”的工作方式。他对很多标准都持怀疑态度,当然最明显的就是EJB,声称如果谁都没有implement过某个技术而直接制定标准绝对是 dangerous的。他是重证千古推倒一时的人物。就像长坂坡的赵子龙,以一人之力而挡十万雄师。
James Duncan Davidson
1997年到2001年在Sun公司工作,他创建了Tomcat应用服务器,这是使用最为广泛的Java Web服务器,同时还创建了Ant构建工具,Ant使用XML来描述项目的构建以及依赖关系,目前仍是Java Web项目构建的事实标准。
Craig R. McClanahan
1960年出生于丹麦Aarhus。Java Server Faces(JSF)技术规范组负责人,Apache Struts framework创始人,Java Studio Creator负责人,《Struts in action》作者。他是servlet 2.2, 2.3和JSP 1.1, 1.2规范的专家组之一,也是Tomcat servlet container Catalina的架构师。
Marc Fleury
在2001年创办了JBoss,这是一个开源的Java应用服务器,后来该软件卖给了红帽公司,然后加入红帽公司继续JBoss的开发,直到2007年2月。
Bruce Eckel    
Bruce Eckel是顶级的计算机技术作家,他有超人的表达能力。他是C++标准委员会拥有表决权的成员之一,拥有应用物理学学士和计算机工程硕士学位。他写的《Thinking in Java》成为天字第一号的Java教科书,风靡全球。本书内容丰富—从Java的基础语法到最高级特性,适合各层次的Java程序员阅读,Java在全球的扩展,Bruce功不可没。
Li Gong
宫力在北京出生长大,在清华大学获得计算机科学的学士学位和硕士学位,并在英国剑桥大学获得计算机科学博士学位。1996年,宫力博士加入Sun公司,担任Java首席安全架构师并设计了今天为数百万用户所广泛使用的Java平台安全架构。2001年他回到北京组建中国Sun工程研究院,担任院长。
从对Java的影响来看,宫力还排不上这个名单,不过他是华人里面对Java贡献最大的人,所以我也列在此了。他回到中国后,被称为“Java在中国的最高智慧。”
他的名字Li Gong跟一个女明星(巩俐)的一样,一次他去新加坡,机场方面以为天皇巨星到了新加坡了,机场总裁亲自迎驾,这个一度在Sun公司内部传为笑谈。

学习编程,掌握语法只是入门,真正的提升还是不断练习,用优化的方法解决实际的问题。所以要不停想不停学不停练。
前辈大师总结了很多规律,提出的一些建议,可以再自己的实战过程中去使用。下面我列出《Effective Java》里面的编程建议:

Creating and Destroying Objects
创建和销毁对象
Item 1: Consider static factory methods instead of constructors.
1  考虑用静态工厂方法替换构造器
Item 2: Consider a builder when faced with many constructor parameters.
2  当遇到多个构造器参数时考虑用构建器(建造者)替换
Item 3: Enforce the singleton property with a private constructor or an enum type .
3  用私有构造器或者枚举类型强化单例属性
Item 4: Enforce noninstantiability with a private constructor .
4  通过私有构造器强化不可实例化的能力
Item 5: Prefer dependency injection to hardwiring resources.
5  依赖注入优先硬连接资源
Item 6: Avoid creating unnecessary objects.
6  避免创建不必要的对象
Item 7: Eliminate obsolete object references.
7  消除过期的对象引用
Item 8: Avoid finalizers and cleaners.
8  避免使用终结方法和清理器
Item 9: Prefer try-with-resources to try-finally.
9  try-with-resources优先try-finally

Methods Common to All Objects .
所有对象通用的方法
Item 10: Obey the general contract when overriding equals.
10 覆写equals时候遵守通用规定
Item 11: Always override hashCode when you override equals.
11  覆写equals时候总要覆写hashCode
Item 12: Always override toString.
12  始终覆写toString
Item 13: Override clone judiciously.
13  小心覆写clone
Item 14: Consider implementing Comparable.
14  考虑实现Comparable接口

Classes and Interfaces.
类和接口
Item 15: Minimize the accessibility of classes and members.
15 使类和成员可见性最小
Item 16: In public classes, use accessor methods, not public fields.
16  公有类中使用访问方法而非公有域
Item 17: Minimize mutability .
17  使可变性最小
Item 18: Favor composition over inheritance .
18  组合优于继承
Item 19: Design and document for inheritance or else prohibit it.
19  要么为继承而设计并提供文档,要么禁止继承
Item 20: Prefer interfaces to abstract classes .
20  接口优于抽象类
Item 21: Design interfaces for posterity.
21  为后代设计接口
Item 22: Use interfaces only to define types.
22  接口只用于定义类型
Item 23: Prefer class hierarchies to tagged classes.
23  类继承优于标签类
Item 24: Favor static member classes over nonstatic.
24 优先考虑静态类而不是非静态
Item 25: Limit source files to a single top-level class.
25  将源文件限制为单个顶级类

Generics
泛型
Item 26: Don’t use raw types.
26  不要使用原生类型
Item 27: Eliminate unchecked warnings.
27  消除非受检警告
Item 28: Prefer lists to arrays.
28  list优于数组
Item 29: Favor generic types.
29  优先考虑泛型
Item 30: Favor generic methods.
30  优先考虑泛型方法
Item 31: Use bounded wildcards to increase API flexibility.
31  使用有界通配符提升API的灵活性
Item 32: Combine generics and varargs judiciously.
32  小心组合泛型和可变参数  @
Item 33: Consider typesafe heterogeneous containers.
33  优先考虑类型安全的异构容器

Enums and Annotations.
枚举和注解
Item 34: Use enums instead of int constants.
34 用enum代替int常量
Item 35: Use instance fields instead of ordinals.
35  用实例域代替序数
Item 36: Use EnumSet instead of bit fields.
36  用EnumSet代替位域
Item 37: Use EnumMap instead of ordinal indexing.
37  用EnumMap代替序数索引
Item 38: Emulate extensible enums with interfaces .
38  用接口模拟可扩展的枚举
Item 39: Prefer annotations to naming patterns.
39  注解优于命名模式
Item 40: Consistently use the Override annotation.
40  统一使用Override注解
Item 41: Use marker interfaces to define types.
41  用标记接口定义类型

Lambdas and Streams.
Lambda表达式和流
Item 42: Prefer lambdas to anonymous classes.
42 Lambda表达式优于匿名类
Item 43: Prefer method references to lambdas.
43  方法引用优于Lambda表达式
Item 44: Favor the use of standard functional interfaces.
44  优先使用标准的函数式接口
Item 45: Use streams judiciously.
45  小心使用流
Item 46: Prefer side-effect-free functions in streams.
46  流中优先使用无副作用的函数
Item 47: Prefer Collection to Stream as a return type.
47  返回类型Collection优先流
Item 48: Use caution when making streams parallel.
48  当创建并行流的时候小心些

Methods.
方法
Item 49: Check parameters for validity.
49  检查参数的有效性
Item 50: Make defensive copies when needed.
50  需要时进行保护性拷贝
Item 51: Design method signatures carefully.
51  小心设计方法签名
Item 52: Use overloading judiciously.
52  谨慎使用重载
Item 53: Use varargs judiciously.
53  谨慎可变参数
Item 54: Return empty collections or arrays, not nulls.
54  返回空集合或者数组,而不是null
Item 55: Return optionals judiciously.
55  谨慎返回Optionals
Item 56: Write doc comments for all exposed API elements.
56  为所有导出的API元素写文档注释

General Programming
通用程序设计
Item 57: Minimize the scope of local variables.
57  最小化局部变量作用域
Item 58: Prefer for-each loops to traditional for loops.
58  for each优于传统for循环
Item 59: Know and use the libraries.
59  了解和使用类库
Item 60: Avoid float and double if exact answers are required.
60   如果需要精确答案,避免使用float和double
Item 61: Prefer primitive types to boxed primitives.
61  基本类型优于装箱类型
Item 62: Avoid strings where other types are more appropriate.
62  如果其他类型更合适,避免使用String
Item 63: Beware the performance of string concatenation.
63  小心String连接性能
Item 64: Refer to objects by their interfaces.
64  通过接口引用对象
Item 65: Prefer interfaces to reflection.
65  接口优于反射
Item 66: Use native methods judiciously.
66  谨慎使用本地方法
Item 67: Optimize judiciously.
67  谨慎优化
Item 68: Adhere to generally accepted naming conventions.
68  遵守普遍的命名规范

Exceptions
异常
Item 69: Use exceptions only for exceptional conditions.
69  只针对异常情况才使用异常
Item 70: Use checked exceptions for recoverable conditions and runtime exceptions for programming errors.
70  对可恢复的情况使用受检异常,对编程错误使用运行时异常
Item 71: Avoid unnecessary use of checked exceptions.
71  避免不必要使用受检异常
Item 72: Favor the use of standard exceptions.
72  优先使用标准异常
Item 73: Throw exceptions appropriate to the abstraction.
73  抛出与抽象对应的异常
Item 74: Document all exceptions thrown by each method.
74  每个方法抛出异常要有文档
Item 75: Include failure-capture information in detail messages.
75  在细节信息中包含捕获失败的信息
Item 76: Strive for failure atomicity.
76  努力使失败保持原子性
Item 77: Don’t ignore exceptions.
77  不要忽略异常

Concurrency
并发
Item 78: Synchronize access to shared mutable data.
78  同步访问共享可变数据
Item 79: Avoid excessive synchronization.
79  避免过度同步
Item 80: Prefer executors, tasks, and streams to threads.
80  executors,task,stream优于线程
Item 81: Prefer concurrency utilities to wait and notify.
81  并发工具优于wait和notify
Item 82: Document thread safety.
82  线程安全文档化
Item 83: Use lazy initialization judiciously.
83  慎用延迟初始化
Item 84: Don’t depend on the thread scheduler.
84  不要依赖线程调度器

Serialization
序列化
Item 85: Prefer alternatives to Java serialization.
85  考虑其他可选择优于Java序列化
Item 86: Implement Serializable with great caution.
86  谨慎实现Serializable接口
Item 87: Consider using a custom serialized form.
87  考虑使用自定义序列化形式
Item 88: Write readObject methods defensively.
88  保护性编写readObject方法
Item 89: For instance control, prefer enum types to readResolve.
89  对于实例控制,枚举优于readResolve
Item 90: Consider serialization proxies instead of serialized instances.
90  考虑序列化代理替换序列化实例  

“学不可以已。”当年我们听说James Gosling还要看Java编程的书诸如《Effective Java》这一类的时候,我们很惊奇。很多程序员会觉得Gosling应该不用看什么书了,事实上,他要看的。开卷有益,不同的人有不同的思路,博闻广识,就会不断进步,终成大器。
学习进步的法门,只在专心一途。现今社会的诱惑很多,让人很难安心踏实下来钻研一门技术,而获取信息太过便利,海量的信息反而让人无所适从。但是须知“弱水三千,取一瓢饮”,人生而有涯,只有静心钻研一门学问才能学有所成。《三字经》里面就讲到:教之道,贵以专。只要我们志向高远,就能不惧风雨不畏人言,不随波逐流。“天下有大勇者,卒然临之而不惊,无故加之而不怒。此其所挟持者甚大,而其志甚远也”(苏轼·《留侯论》)
有了专心的方向,然后就从低到高,沿着台阶一步一个脚印,课题解决一个就是一个,积累下来就不得了,一而十,十而百,百而千,千而万。转首回望,我们已经一览众山小。
大家要有心理准备,这是一个漫长而艰苦孤独的历程。一个完整的过程是起步于孤愤的立志,中间是艰难的跋涉,终结于喜悦的心得。王国维《人间词话》语:
古今之成大事业、大学问者,必经过三种之境界: “昨夜西风凋碧树,独上高楼,望尽天涯路。” 此第一境也。 “ 衣带渐宽终不悔,为伊消得人憔悴。” 此第二境也。 “ 众里寻他千百度,蓦然回首,那人却在,灯火阑珊处。”此第三境也。

任重道远,君子当自强不息。