您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > JAVA

从 Java 11 迁移到 Java 17 值得吗?

时间:2023-08-09 11:29:01  来源:51CTO  作者:

作者丨Sergei Dzeboev

编译丨诺亚

JAVA17给Java带来了一些变化,但也使许多开发人员重新考虑他们迁移到其他JVM语言的愿望。最明显的变化是在使Java代码现代化和添加新的语言结构以简化它的方向上进行的。当然,这个问题并非没有对Java核心的改变,这使得Java更加高效。

1、文本块

文本块功能终于出现在Java中。我确信这是Java程序员等待已久的变化之一。现在你可以忘记难以阅读的长复合行。文本块允许你以最方便的方式编写多行文本。在这样的块中,你可以按照自己希望的方式撰写文本,并且仍然可以使用转义序列进行更精确的格式设置。

Java11. 字符串转义序列:

复制

public String poem = " " +

"Twinkle, Twinkle, Little Star" +

" " +

" Twinkle, twinkle, little star," +

" How I wonder what you are!" +

" Up above the world so high," +

" Like a diamond in the sky." +

" " +

" Twinkle, twinkle, little star," +

" How I wonder what you are!";

Java17.文本块:

复制

public String poem = """

Twinkle, Twinkle, Little Star

Twinkle, twinkle, little star,

How I wonder what you are!

Up above the world so high,

Like a diamond in the sky.

Twinkle, twinkle, little star,

How I wonder what you are!

""";

2、Record

另一个慢慢使Java语言更有用的更新是record。以前,要创建一个类,我们需要描述该类,指定其字段,并添加必要的方法,例如equals、hashcode、getter和setters。自从record出现以来,所有这些现在都变得不必要了。

record允许你通过仅指定必填字段来创建数据安全类;将自动创建所有其他方法。但是,值得记住的是,record充当数据类,创建是为了存储数据,而不是执行各种操作。record是线程安全的,因为所有record字段都是最终的。最后要知道的重要一点是,用于获取字段值的生成方法不会像经典Java Bean 中那样包含“get”。

Java11.数据类:

复制

public class DataClass {

public DataClass (Integer id, String name) {

this.id = id;

this.name = name;

}

private final Integer id;

private final String name;

public Integer getId() {

return id;

}

public String getName() {

return name;

}

@Override

public boolean equals(Object o) {

}

@Override

public int hashCode() {

}

}

Java17.Record:

复制

public record DataClass(Integer id, String name) {

}

区别很明显:在执行相同功能的同时,创建Record所需的代码行要少得多。

3、新的switch表达式

更改列表还包括切换表达式。这些更改不仅影响了Switch表达式的语法(使其编写更加简洁),还影响了功能。Switch表达式现在返回迭代的结果,使编写代码变得更加容易,并使其更加简洁。新的开关表达式不再需要每个case后面都加一个break

Java11.switch表达式:

复制

public String getSeasonDescription(Season season) {

String seasonDescription;

switch (season) {

case SPRING:

seasonDescription = "Flowers are blooming!";

break;

case SUMMER:

seasonDescription = "It's hot outside!";

break;

case AUTUMN:

seasonDescription = "Leaves are falling!";

break;

case WINTER:

seasonDescription = "Snow is coming!";

break;

default:

throw new IllegalStateException("Invalid season: " + season);

}

return seasonDescription;

}

Java 17. 增强的 Switch 表达式:

复制

public String getSeasonDescription(Season season) {

return switch (season) {

case SPRING -> "Flowers are blooming!";

case SUMMER -> "It's hot outside!";

case AUTUMN -> "Leaves are falling!";

case WINTER -> "Snow is coming!";

};

}

4、instanceof模式匹配

另一项设计改进也影响了操作员。现在,更安全,更简洁。通过此更改,不再需要首先检查给定对象是否是某个类的实例,然后执行强制转换;现在可以在一行中完成此操作。如前所述,这不仅仅是语法糖,而是一个更优化的运算符。

Java 11. 经典的 intanceof

复制

public void findInstance(Object o) {

if (o instanceof String) {

String s = (String) o;

System.out.printf("Object is a string %s", s);

} else if (o instanceof Number) {

Number n = (Number) o;

System.out.printf("Object is a number %n", n);

}

}

Java 17. 更新的 intanceof

复制

public void findInstance(Object o) {

if (o instanceof String s) {

System.out.printf("Object is a string %s", s);

} else if (o instanceof Number n) {

System.out.printf("Object is a number %n", n);

}

}

5、Sealed Classes密封类

Java 17也考虑了安全性,并朝着这个方向迈出了重要的一步。这个想法是限制类或接口的继承,同时保持其公开。结果,新的类类型,密封类,被添加到Java中。密封类的语法允许你指定可以使用其功能的后代。反过来,继承者还可以允许或拒绝继承,或者指定可以沿链继承的类。此功能使你可以更灵活地创建项目,并方便地调整代码的API。

Java 17. 密封类:

复制

public sealed class SealedClass permits AnotherSealedClass, AnotherNonSealedClass, AnotherFinalClass {

}

Java 17. 非密封继承人:

复制

public non-sealed class AnotherNonSealedClass extends SealedClass {

}

Java17.最终继承人:

复制

public final class AnotherFinalClass extends SealedClass {

}

Java17.密封继承人:

复制

public sealed class AnotherSealedClass extends SealedClass permits AnotherNonSealedClassTwo {

}

JavAI17.非密封继承人二级:

复制

public non-sealed class AnotherNonSealedClassTwo extends AnotherSealedClass {

}

6、NullPointerExceptions

最后,Java 17 中一个非常有用的更新是改进的NullPointerException!最后,在堆栈跟踪日志中,你可以看到哪个特定字段导致了NullPointerException。仅此功能就应该鼓励你切换到Java 17。你不再需要长时间在代码中四处寻找发生异常的险恶地方;现在Java将为你完成所有工作。

Java11.NPE:

复制

public static void main(String... args) {

String s = null;

System.out.println(s.toLowerCase());

}

复制

Exception in thread "main" java.lang.NullPointerException

at Main.main(Main.java:4)

Java17.改进的NPE:

复制

public static void main(String... args){

String s = null;

System.out.println(s.toLowerCase());

}

复制

Exception in thread "main" java.lang.NullPointerException: Cannot invoke "String.toLowerCase()" because "s" is null

at edu.javamodules/edu.javaversions.eleventoseventeen.NpeExample.main(NpeExample.java:7)

7、其他创新

当然,这并不是Java17中所做的更改的全部列表,但是讨论的创新是最引人注目的。与往常一样,Java开发人员在改进JVM方面做得非常出色,使其更加高效。

8、小结

Java17中所做的所有改进都传达了一个信息:是时候切换到这个版本了。过渡承诺语法更简洁,性能得到提高。你的项目将获得安全性、灵活性和更好的错误消息。如果你已经迁移到Java11,那么迁移到Java17 会很顺利。Java的竞争优势在这里大放异彩,因为向后兼容性允许你切换到Java17而无需更改任何代码,并利用所有更新的功能。Java17是Java11以来又一个LTS(长期支持)版本,可确保你在较长时间内收到所有必要的安全更新。

原文链接:https://hackernoon.com/is-migrating-from-java-11-to-java-17-worth-it



Tags:Java 17   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
从 Java 11 迁移到 Java 17 值得吗?
作者丨Sergei Dzeboev编译丨诺亚Java17给Java带来了一些变化,但也使许多开发人员重新考虑他们迁移到其他JVM语言的愿望。最明显的变化是在使Java代码现代化和添加新的语言结...【详细内容】
2023-08-09  Search: Java 17  点击:(344)  评论:(0)  加入收藏
Java 17的新特性都有什么?
目前Java 17于2021年9月发布,增加和更新了许多新功能和增强功能。本文将详细介绍Java 17中一些最令人兴奋的新功能,并提供代码片段来说明对应的使用方法。 1 instanceof运算...【详细内容】
2023-07-12  Search: Java 17  点击:(62)  评论:(0)  加入收藏
详解 Java 17中的新特性:“密封类”
Java 17推出的新特性Sealed Classes经历了2个Preview版本(JDK 15中的JEP 360、JDK 16中的JEP 397),最终定稿于JDK 17中的JEP 409。Sealed Classes有两种主流翻译:密封类、封闭类...【详细内容】
2022-05-06  Search: Java 17  点击:(435)  评论:(0)  加入收藏
▌简易百科推荐
Java 8 内存管理原理解析及内存故障排查实践
本文介绍Java8虚拟机的内存区域划分、内存垃圾回收工作原理解析、虚拟机内存分配配置,以及各垃圾收集器优缺点及场景应用、实践内存故障场景排查诊断,方便读者面临内存故障时...【详细内容】
2024-03-20  vivo互联网技术    Tags:Java 8   点击:(14)  评论:(0)  加入收藏
如何编写高性能的Java代码
作者 | 波哥审校 | 重楼在当今软件开发领域,编写高性能的Java代码是至关重要的。Java作为一种流行的编程语言,拥有强大的生态系统和丰富的工具链,但是要写出性能优异的Java代码...【详细内容】
2024-03-20    51CTO  Tags:Java代码   点击:(21)  评论:(0)  加入收藏
在Java应用程序中释放峰值性能:配置文件引导优化(PGO)概述
译者 | 李睿审校 | 重楼在Java开发领域,优化应用程序的性能是开发人员的持续追求。配置文件引导优化(Profile-Guided Optimization,PGO)是一种功能强大的技术,能够显著地提高Ja...【详细内容】
2024-03-18    51CTO  Tags:Java   点击:(24)  评论:(0)  加入收藏
Java生产环境下性能监控与调优详解
堆是 JVM 内存中最大的一块内存空间,该内存被所有线程共享,几乎所有对象和数组都被分配到了堆内存中。堆被划分为新生代和老年代,新生代又被进一步划分为 Eden 和 Survivor 区,...【详细内容】
2024-02-04  大雷家吃饭    Tags:Java   点击:(56)  评论:(0)  加入收藏
在项目中如何避免和解决Java内存泄漏问题
在Java中,内存泄漏通常指的是程序中存在一些不再使用的对象或数据结构仍然保持对内存的引用,从而导致这些对象无法被垃圾回收器回收,最终导致内存占用不断增加,进而影响程序的性...【详细内容】
2024-02-01  编程技术汇  今日头条  Tags:Java   点击:(68)  评论:(0)  加入收藏
Java中的缓存技术及其使用场景
Java中的缓存技术是一种优化手段,用于提高应用程序的性能和响应速度。缓存技术通过将计算结果或者经常访问的数据存储在快速访问的存储介质中,以便下次需要时可以更快地获取。...【详细内容】
2024-01-30  编程技术汇    Tags:Java   点击:(72)  评论:(0)  加入收藏
JDK17 与 JDK11 特性差异浅谈
从 JDK11 到 JDK17 ,Java 的发展经历了一系列重要的里程碑。其中最重要的是 JDK17 的发布,这是一个长期支持(LTS)版本,它将获得长期的更新和支持,有助于保持程序的稳定性和可靠性...【详细内容】
2024-01-26  政采云技术  51CTO  Tags:JDK17   点击:(88)  评论:(0)  加入收藏
Java并发编程高阶技术
随着计算机硬件的发展,多核处理器的普及和内存容量的增加,利用多线程实现异步并发成为提升程序性能的重要途径。在Java中,多线程的使用能够更好地发挥硬件资源,提高程序的响应...【详细内容】
2024-01-19  大雷家吃饭    Tags:Java   点击:(105)  评论:(0)  加入收藏
这篇文章彻底让你了解Java与RPA
前段时间更新系统的时候,发现多了一个名为Power Automate的应用,打开了解后发现是一个自动化应用,根据其描述,可以自动执行所有日常任务,说的还是比较夸张,简单用了下,对于office、...【详细内容】
2024-01-17  Java技术指北  微信公众号  Tags:Java   点击:(95)  评论:(0)  加入收藏
Java 在 2023 年仍然流行的 25 个原因
译者 | 刘汪洋审校 | 重楼学习 Java 的过程中,我意识到在 90 年代末 OOP 正值鼎盛时期,Java 作为能够真正实现这些概念的语言显得尤为突出(尽管我此前学过 C++,但相比 Java 影响...【详细内容】
2024-01-10  刘汪洋  51CTO  Tags:Java   点击:(74)  评论:(0)  加入收藏
相关文章
    无相关信息
站内最新
站内热门
站内头条