技术底层的变更:从Java8升级到Java17势在必行
不久前Spring社区抛弃了Java8的框架生成支持,直接默认Java17,说明spring是下决心放弃Java8拥抱云原生时代的Java17生态。从Java 8 到 Java 20,Java 已经走过了漫长的道路,自 Java 8 以来,Java 生态系统发生了很多变化。最显着的变化是 Java 的发布节奏。Java 8 于 2014 年发布,Java 17 于 2021 年发布。这两个版本之间相隔了 7 年。Java17是一个长期支持(LTS)的版本,会有更稳定和持久的维护和更新。Java8一直用得很好,为什么要升级到Java17呢?这就不得不研究一下从8到17发生了什么变革。
1.局部变量类型推断
这是自 Java 8 以来添加到 Java 中的最受欢迎的功能之一。它允许你在不指定类型的情况下声明局部变量。类型是从表达式的右侧推断出来的。此功能也称为var
类型。当我们使用的变量过多,代码的可读性会受到一定影响。而且,有时候开发人员会尽力避免声明中间变量,因为太多的类型声明只会分散注意力。所以我们在 JDK 10 中引入了 var。
注意:
1. 局部变量不赋值,就不能实现类型推断
2. lambda 表达式中,左边的函数式接口不能声明为 var
3. 方法引用中,左边的函数式接口不能声明为 var
4. 数组的静态初始化中,需要有一边声明数据类型
5. var 并不会改变 Java 是一门静态语言的事实
在 Java 10 的情况下,我们使用var
不是指定类型,而是创建引用。
2.switch表达式
在 Java 14 中使用 switch 表达式时,你不必使用关键字break
来跳出 switch 语句或return
在每个 switch case 上使用关键字来返回值;相反,你可以返回整个 switch 表达式。这种增强的 switch 表达式使整体代码看起来更清晰,更易于阅读。
4.Records
记录Records是添加到 Java 14 的一项新功能。它允许你创建用于存储数据的类。它类似于 POJO 类,但代码少得多;大多数开发人员使用 Lombok 生成 POJO 类,但是有了记录,你就不需要使用任何第三方库。在下面的示例中,你可以看到创建记录类所需的代码非常少。
5.模式匹配instanceof
模式匹配instanceof
是 Java 16 中添加的新功能。可以将instanceof
运算符用作返回已转换对象的表达式。当你使用嵌套的 if-else 语句时,这非常有用。在下面的示例中,你可以看到我们如何使用instanceof
运算符来捕获Employee
对象,而不是进行显式转换。
instanceof操作后面的&&与操作里也可以继续使用instanceof的变量,不过由于短路操作,后面的||或操作不能使用instanceof的变量,因为有可能instanceof不满足新变量未定义;
6. 密封类
密封类是添加到 Java 17 中的一项新功能。它允许你将类或接口的继承限制为一组有限的子类。当你想将类或接口的继承限制为一组有限的子类时,这非常有用。在下面的示例中,你可以看到我们如何使用sealed
关键字将类的继承限制为一组有限的子类。
密封类(Sealed Classes),这个概念在许多语言中都存在。例如,在C#中的密封类表示表明该类是最终类(不可被继承);在Scala中密封类表示case类的子类只能限定在当前源文件中定义;在Kotlin中密封类要求其子类只能在当前源文件中定义。尽管不同语言中的密封类的概念各不相同,但总的来说都是对子类的继承进行了限制,只不过这个继承的限制范围和程度各不一样。那么密封类的密封概念就比较清晰了,即:限制类的继承。
关于密封类的深度解析,可以参见:https://baijiahao.baidu.com/s?id=1723222165037050669
public sealed interface dogService extends animalService permits dogServiceImpl { // 密封类
void doSomething();
}
public final class dogServiceImpl implements dogService { // final修饰的子类 不能再被继承扩展
@Override
public void doSomething() {
}
}
public non-sealed class dogServiceImpl implements dogService { // 非密封子类,可以继承扩展
@Override
public void doSomething() {
}
static class bigDogExtend extends dogServiceImpl {
}
}
7. 有用的 NullPointerException
NullPointerExceptions 是 Java 14 中添加的一项新功能。它允许你获取有关NullPointerExceptions
. 这在调试时非常有用NullPointerExceptions
。在下面的示例中,你可以看到相同的代码如何NullPointerExceptions
在 Java 8 和 Java 14 中生成不同的结果,但在 Java 14 中,你可以获得有关异常的更多信息。
简单来说,就是发生空指针异常时,异常信息会告诉你是哪个变量为null,而在14之前只能定位到行,大大节省了异常检查的时间。
以上讲解了主要的特性,当然还有一个至关重要的方面,就是Java17开始有了增强版的Graalvm云原生统一虚拟机,并且支持生成native字节码,对于某些场合下的应用意义重大。Graalvm支持在server端运行js、python等各种流行语言。我觉得Java + Js + Python组合就是无敌的存在,可以在人工智能、大数据等领域冲浪了。
以上说了Java17以来的诸多Java特性,那么为什么要升级到Java17呢?
一是性能有了质的飞跃;二是生态得到了目前最大限度的扩展和支持;三是编码的效率提升了;四是更加符合人工智能和大数据时代的要求;五是17是最新的长期支持版且有免费商用方案大家都开始迁移了。
声明: 除非转自他站(如有侵权,请联系处理)外,本文采用 BY-NC-SA 协议进行授权 | 嗅谱网
转载请注明:转自《技术底层的变更:从Java8升级到Java17势在必行》
本文地址:http://www.xiupu.net/archives-11273.html
关注公众号:
微信赞赏
支付宝赞赏