gitbook/深入剖析Java新特性/docs/444715.md
2022-09-03 22:05:03 +08:00

119 lines
12 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 开篇词 | 拥抱Java新特性像设计者一样工作和思考
你好我是范学雷欢迎加入我的课程。从今天开始我要用20讲的时间和你聊聊JDK 8之后Java最重要的一些新特性。
说到新特性啊,有些人可能会不以为然,他们会说:
* 学这些新东西有必要吗?
* 新特性好是好,还是等到用到的时候再去学习吧!
* Java已经老了为什么我不去学习新语言呢
* 网上有很多关于Java新特性的文章为什么还要学习你这个专栏
我理解为什么会有这样的问题,尽管我持有不一样的观点。
作为Oracle的成员Java安全的主要推动者和贡献者之一我从JDK 5开始就一直在参与Java语言及其标准类库的设计和演进。我的日常工作包括关注信息安全威胁与技术进展制定与实现Java安全规范促进 Java 技术的普及与运用等等。
在每一个JDK的版本里你都能看到大量我共享过和评审过的代码。在这一过程中我也体验了很多优秀的设计和优秀的代码见证了代码背后的各种考量和艰难取舍。
比如说在代码安全性和性能之间我们该如何抉择在代码的可维护性方面我们能不能有所提高API的设计能不能再皮实一点这些问题刚开始学习编程的同学可能太不在意但是解决好这些问题可以使我们的工作轻松很多。
我还在极客时间上线了专栏《代码精进之路》和《实用密码学》分享了我在Java和密码学领域的经验。一直以来与Java还有这些新特性的接触让我对上述问题有过很认真的思考。我认为**学习Java新特性不仅很有必要而且最好的时机就是现在。**
给你一个保守、粗暴的估计你如果从JDK 8迁移到JDK 17并且能够恰当使用JDK 8以后的新特性的话产品的代码量可以减少20%代码错误可以减少20%产品性能可以提高20%维护成本可以降低20%。这些,都是实实在在的收益。
## 拥抱Java新特性掌握主动权
为什么我会得出这样的结论呢?
从设计者的角度,我们设计一项新特性,是为了满足新的需求,为了适应更广阔的前景。而这些新特性的优越性,会随着时间的推进越来越明显。
比如说吧JDK 1.4.2所在的时代,用户的数量还没有这么多,服务器也不需要支持那么多的并发。所以,当时主流的客户端-服务器的设计,是使用阻塞式的套接字接口编程。现在,如果淘宝、京东还使用阻塞式的套接字接口,那是没有一点希望支持双十一的巨大流量的。
Java的有些新技术甚至能催生一个新行业。比如Java代理的技术就至少催生了动态监控和入侵检测两大领域的颠覆性变革并且诞生了数家明星公司和明星产品。Java代理的技术的本意并不是动态监控和入侵检测但是用户创造性地使用了这项基础技术实现了应用技术的关键突破。
现在Java已经迭代到了JDK 17不需要依靠内幕消息我们也能知道主流企业很快就会拥抱JDK 11或者JDK 17就像它们曾经拥抱过JDK 7或者JDK 8一样。
所以,不管你拒绝新技术、新特性的理由是什么。跟不上技术进步?认为新技术没有用?你都是时候重新审视它了。可以说,对于致力于创造新价值的我们来说,既然投身于计算机科学的领域,除了拥抱新技术,我们没有别的选择。
如果你因此退却,想要去学习一门新的语言。我也想要提醒一句,两口五尺深的井打出的水,并不一定比十尺深的井里的水甜。
**那可不可以等到需要用的时候,再去学习这些新特性呢?**
这么听起来好像有道理。但我想你也没法否认,很多技术,你不了解它,它是不会进入你的意识里来的,你也不会知道什么时候该使用它。因为,在你的世界里,它根本就不存在;它要解决的问题,你当然也不是很清楚。
如果你坚持不去了解不去积累,那就丧失了主动性,只能是被动的跟随者,甚至是拖后腿的反对者。**而高级工程师和初级工程师之间的差距,恰恰就是积累和见识。你打破脑袋想不出的问题,在别人那里也许看一眼就能解决。**
如果可以,为什么不现在就积累呢?尽早成为一个方案的制定者,而不是执行者,不是更好吗?
## 像Java语言的设计者一样思考
你可能对Java的新特性并不了解或者已经在网络上看到了很多讲解Java新特性的文章。这些资料可能会告诉你这些新特性的种类、使用方法。但在我看来了解一个新特性背后的这些逻辑和实际运用发掘它未来的潜力远远比学会这个新特性更重要。
在设计新特性时我们还要考量这项新特性是否能够持续地满足新的需求Requirement、增强代码安全Security、提高生产效率Productivity 、提升产品性能Performance、降低维护成本Maintenance
基于这些考量除了对于单个的新特性的介绍我还会和你讨论新技术组合的化学反应比如在第8讲到第9讲我们会讨论怎么通过封闭类、档案类以及模式匹配的叠加效果把代码的错误处理性能提高数百倍。
无论你的基础如何,我都可以从新特性设计者的角度带你由浅及深地了解它们,而且可以让你学得更快、更精准、更深入,减少自己摸索的过程,更快地获得竞争的优势。
在使用云计算的时代,每一份性能提升,都是实实在在的成本消减;每一点工作效率的提升,都能为你争取到更多休闲时光;每一份错误的减少,都可以尽快熄灭深夜的灯光。何乐而不为呢?
## 我们会一起学习哪些新特性?
可是从JDK 9到JDK17这么多的版本和新特性到底要从哪里开始学、怎么学才能迅速、精准地抓到这些新特性的精髓提高工作效率呢
在这门课程里我从JDK 9到JDK 17的新特性中筛选出了最核心、有用的18条特性。我会分三个模块给你讲解一般软件工程师需要经常使用的Java语言新技能。
在第一模块,我会给你介绍一些可以提升编码效率的特性,比如说档案类。
可以说档案类是一个看起来不起眼的小技术。但它却具有巨大的能量。我们的代码里存在大量的只读性质的数据。没有档案类的时候我们要想把一个数据正确地表述好抽象成一个类需要上百行的代码还要小心遵守Java的各种规范比如说比较两个实例的规矩。有了档案类完全相同的逻辑就只需要一两行代码了。毫无疑问档案类会把我们从千篇一律的数据表述代码里解放出来有更多的时间专注于真正有价值的工作。
学完这一部分内容你能够使用这些新特性大幅度提高自己的编码效率降低编码错误。保守估计你的编码效率可以提高20%。这也就意味着,如果工作量不变,每一个星期你都可以多休息一天。
在第二模块,我们会把焦点放在提升代码性能上,比如错误处理的最新成果。
使用异常来处理错误的逻辑抛出异常和捕获异常一直以来都是Java错误处理的不二选择。然而抛出异常和捕获异常的开销是巨大的在按计算能力付费的环境下异常处理的意外开销是增厚账单的一个重要因素。因此Go语言甚至完全放弃了异常处理的方式。当Java语言发展到JDK 17的时候我们有没有办法在Java语言里使用类似于Go语言的错误处理方式甚至变得更好呢这些问题你会在第二个模块里找到答案。
学完这一部分内容你将能够使用这些新特性大幅度提高软件产品的性能帮助公司提高用户满意度节省运营费用。保守估计你编写代码的性能可以提高20%,甚至更多。
在第三模块我会跟你讲讲如何通过新特性降低维护难度比如模块化和安全性、兼容性问题。学完这一部分内容你将能够编写出更健壮更容易维护的代码并且能够知道怎么高效地把旧系统升级到Java的新版本。这一部分的目标就是帮助你把代码的维护成本降低20%或者更多。
![](https://static001.geekbang.org/resource/image/64/1d/64b94870406083046de58c5e8aa6bf1d.jpeg?wh=1563x3610)
## 以终为始,这样学习新特性对你帮助最大
在讲解这些新特性的时候,我会以终为始,从便于你使用它们写出高质量代码的角度来展开。
**首先,这门课会采用案例阅读和讨论的形式展开。**
每一个新特性,我们都从阅读案例开始。这样,随着对案例的拆解和步步深入的改进,我们能够更加了解它们,理解每一个新特性诞生背后的推动力量。
这能够提高你的见识和思辨能力。让你的面试不再停留在无话可说、无题可聊的表面层次上。同时,你的代码编写能力也会有所提升。
所以,请你一定认真阅读、思考每一个案例,这是你学习这门课的基础。
**然后,我还启用了多样的代码样本。**
学习一门语言的新技术,最好的办法就是反复地折腾软件代码。看看什么样的写法是合法的,什么样的写法是非法的;什么样的写法更有效率,什么样的写法会是一团糟。所以,这门课的每一讲、每一个新特性,我们都会反复地讨论:以前的代码能怎么写,现在代码该怎么写,什么样的代码容易犯错,什么样的代码更养眼、更健壮,还能有什么样的改进。帮助你掌握运用新技术的方法和场景。
为了方便我们折腾我在GitHub上开设了一个代码库。我希望你能认真阅读这些折腾来折腾去的样本把这些代码下载下来反复地修改持续地改进。
我们都希望在最短的时间内掌握新知识,但事实是,知识与能力之间仍然有着一道巨大的鸿沟。所以,请你花更多的时间,把飘渺的知识,转化成你自己内建的能力。折腾的代码越多,你能从中学到的也就越多。这是提升你能力的关键。
**最后,我还设置了代码评审这样的反馈环节。**
学习最快的途径就是请教更优秀的人一句话的点拨也许就胜过你几年的摸着石头过河。而加入一个社区提交代码接受同行和专家的评审恐怕是目前最现实的、最有效的办法之一了。为了方便大家提交代码和评审代码我在GitHub上开放了代码提交申请。
任何一行你折腾过的代码,包括每一节留下的思考题,你都可以提交一个 GitHub的拉取请求Pull Request然后看看同行们的建议。当然啦对于别人提交的代码来说你也是他们期望寻求帮助的同行。我也会阅读一部分拉取请求给出我的建议我们共同进步。
所以,我建议你一定要积极地参与代码评审这样的反馈环节,给别人反馈也听取别人给你的反馈。在一定意义上,这也决定了你学习的速度和深度。
这样学习下来不管你是刚刚开始学习Java语言还是拥有扎实的Java语言和面向对象设计基础都不再会被下面的问题难住
1. 对新特性略知一二,但却不了解它为什么这么设计、可以解决什么问题、怎么用,导致在面试、在和别人交流技术时,顾左右而言他,要么和心仪的公司失之交臂,要么难以形成自己的技术影响力。
2. 了解了新技术的各种功能、各种概念,但是对它们的最佳实践、运用方法和场景知之甚少,一写代码就没了底气,写出来的代码缺东少西。
3. 看到了旧代码优化的空间,也看到了新技术的前景,但是怎么具体地改进旧代码、写好新代码,好像也想不出更好的办法来。
一句话总结,对于每一个新技术,“**面试聊得开,代码写得好,技术用得上**”,是我希望这门课能够给你带来的提升。
好了今天的内容就先到这里。也期待你可以在留言区和我聊聊你对这门课的期待以及你在学习Java新特性时的经历。接下来让我们正式开始学习Java语言开启这段打怪升级的旅程吧