这用 Java8?JDK17 写法让我一度以为在写 TypeScript

126 阅读5分钟

如果你最近翻看了一段 Java 新版本的代码,

你可能会瞬间愣住:这真的是 Java 吗?怎么像 Kotlin 或 TypeScript?

是的,从冗长到简洁,从模板代码到表达式优先,Java 在 JDK17 之后,已经发生了翻天覆地的变化。

这一次,它真的不再固守老派,而是在主动靠近“现代语言”的写法和思想。

过去的Java:稳重有余,灵活不足

我们最初接触 Java,大多是在 JDK8 或更早的年代。那时候的 Java,特点很鲜明:

  • 类结构完整但冗长;
  • 控制流结构重复啰嗦;
  • 对象封装需要大量样板代码;
  • 没有数据类、密封类,抽象表达力不足。

哪怕只是创建一个简单的用户实体类,也得写上 30 行代码:

public class User {  
    private String name;  
    privateint age;  
  
    public User(String name, int age) {  
        this.name = name;  
        this.age = age;  
    }  
  
    public String getName() { return name; }  
    public int getAge() { return age; }  
  
    @Override  
    public String toString() {  
        return"User{name=" + name + ", age=" + age + "}";  
    }  
}  

这类代码看似规整,实则严重占用开发者时间,久而久之,“Java臃肿”的标签就这样被贴上了。

JDK17来了,Java终于决定“变了”

Java 的转变其实是循序渐进的。从 JDK14、JDK15 开始尝试预览特性,到 JDK17 落地长期支持版本,Java 官方对“语言现代化”的方向已经非常明确。

开发者最先感受到的是语法上的极大简化。

比如,上一节的 User 类,现在可以写成:

public record User(String name, int age) {}  

这不是语法糖,而是 Java 引入的新关键字 record

它自动生成构造器、getter、toString()equals()hashCode()

用于声明不可变的数据载体类,完美适配接口传参、配置对象、VO类等场景。

在传统 Java 项目中,可能有成百上千个“只存数据”的类,

现在,一行就能完成一切,既提高效率,也提升可读性。

switch也变了,从控制结构变成表达式

JDK17 最具代表性的语法革新之一,就是 switch表达式 的全面支持。

我们之前写 switch,都像这样:

int level;  
switch (type) {  
    case "admin":  
        level3;  
        break;  
    case "user":  
        level2;  
        break;  
    default:  
        level1;  
}  

在 JDK17 中,switch 可以直接变成一个表达式,并返回值:

int level = switch (type) {  
    case "admin" -> 3;  
    case "user" -> 2;  
    default -> 1;  
};  

逻辑更紧凑、避免遗漏 break 带来的 bug,且天然支持返回值。

结合 sealed class、模式匹配(Pattern Matching)等未来能力,

Java 正朝着“表达式优先”的范式进化,这在 Java 历史上是第一次。

instanceof也进化了,不用再手动强转

以往我们做类型判断后,还要手动强转:

if (obj instanceof String) {  
    String s = (String) obj;  
    System.out.println(s.length());  
}  

到了 JDK16+,你可以直接:

if (obj instanceof String s) {  
    System.out.println(s.length());  
}  

这就是所谓的 Pattern Matching for instanceof

类型判断+变量绑定一步到位,既少写代码,又更安全、优雅。

不要小看这点改进,对于日常开发中大量的类型判断,能显著提升代码整洁度。

sealed class:控制继承,更精确的建模能力

Java 一直以来对“类能被谁继承”没有很好控制方式。

JDK17 引入 sealed 关键字,允许开发者精准指定哪些子类可以继承某个父类:

public sealed class Shape permits CircleRectangle {}  
  
public final class Circle extends Shape {}  
public final class Rectangle extends Shape {}  

这是 Java 在类型系统层面的重大增强, 与 enumrecord 配合使用时,可以精准建模业务状态、对象分类、权限层级等结构,减少接口暴露风险,提升系统稳定性和可维护性。

模式匹配:还在预览,但未来可期

Java 正在一步步引入 Pattern Matching(模式匹配),包括:

  • instanceof 模式绑定(已落地)
  • switch 的类型模式匹配(JDK21 开始预览)
  • 结构解构(预计在后续版本推出)

目标很明确:让 Java 也能写出像 Scala、Kotlin 那样优雅的模式分支代码。

未来你可以这样处理复杂类型:

switch (shape) {  
    case Circle c -> processCircle(c);  
    case Rectangle r -> processRectangle(r);  
}  

这不仅让代码更短,更让逻辑更清晰、出错概率更低。

对于做多态分支、状态机判断的开发者来说,这无疑是巨大的生产力提升。

Java 没老,只是你还停在过去的版本

很多人还在用 JDK8,这是可以理解的。毕竟它稳定、兼容好、资料多。

但今天的 Java,已经完全不是 JDK8 时代的 Java 了。

它变得更简洁、更多范式支持、更表达式驱动、也更具现代语言特征。

不更新,不仅意味着你写得更累,

也可能意味着:你在被边缘化的 Java 生态中掉队。

写在最后

JDK17 是 Java 跨入新时代的重要节点。

它不像 JDK11 那样只是过渡,也不像 JDK8 那样“过时但顽强”。

这是一个真正意义上的现代开发基线。

它告诉我们:Java 正变得强大,也愿意改变。

如果你已经在使用 JDK17,不妨深入研究这些语法特性;

如果你还停在 JDK8,不如找个周末,花几个小时试试新版本带来的生产力红利。

语言在进步,开发者也应该不断进化。

欢迎留言聊聊你在 JDK17 上的体验和看法,

也可以转发给还停在 JDK8的朋友,告诉他们:

现在的 Java,真的变了。


如果这篇文章让你有所启发,欢迎点赞、转发、在看,

你的支持,是我持续输出干货的最大动力。

微信公众号.jpg