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

作者丨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;


推荐阅读