技术底层的变更:从Java8升级到Java17势在必行

不久前Spring社区抛弃了Java8的框架生成支持,直接默认Java17,说明spring是下决心放弃Java8拥抱云原生时代的Java17生态。从 8 到 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 是一门静态语言的事实

var变量

在 Java 10 的情况下,我们使用var不是指定类型,而是创建引用。

2.switch表达式

在 Java 14 中使用 switch 表达式时,你不必使用关键字break来跳出 switch 语句或return在每个 switch case 上使用关键字来返回值;相反,你可以返回整个 switch 表达式。这种增强的 switch 表达式使整体代码看起来更清晰,更易于阅读。

switch表达式

4.Records

记录Records是添加到 Java 14 的一项新功能。它允许你创建用于存储数据的类。它类似于 POJO 类,但代码少得多;大多数开发人员使用 Lombok 生成 POJO 类,但是有了记录,你就不需要使用任何第三方库。在下面的示例中,你可以看到创建记录类所需的代码非常少。

record记录类

5.模式匹配instanceof

模式匹配instanceof是 Java 16 中添加的新功能。可以将instanceof运算符用作返回已转换对象的表达式。当你使用嵌套的 if-else 语句时,这非常有用。在下面的示例中,你可以看到我们如何使用instanceof运算符来捕获Employee对象,而不是进行显式转换。

instance ofjava 16 instance of

instanceof操作后面的&&与操作里也可以继续使用instanceof的变量,不过由于短路操作,后面的||或操作不能使用instanceof的变量,因为有可能instanceof不满足新变量未定义;

&&引用instance of

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势在必行
本文地址:https://www.zhiletu.com/archives-11273.html
关注公众号:智乐兔

赞赏

wechat pay微信赞赏alipay pay支付宝赞赏

上一篇

相关文章

在线留言

你必须 登录后 才能留言!