Java 17 如何改变你的编程方式

Java 17 是一个长期支持版本 (LTS),于 2021 年发布,包含多个新特性和改进。以下是一些关键的新特性及其示例说明:

代码结构图

1. Pattern Matching for switch (Preview)

Java 17 引入了对 switch 语句的模式匹配功能(作为预览功能)。通过这种方式,switch 语句可以根据对象的类型来执行匹配,从而避免传统的类型转换和显式判断。

示例:

java 复制代码
/**
 * 功能描述:
 *switch 语句可以作为表达式使用,并且返回一个值。
 * @author Songxianyang
 * @date 2024-10-15 11:04
 */
public class SwitchExpression {
    public static void main(String[] args) {
        int i=2;
       String name= switch (i) {
            case 1 -> "my-1";
            case 2 -> "my-2";
            case 3 -> "my-3";
            default -> "my";
        };
        System.out.println(name);
    }
}

输出:

2. Sealed Classes

密封类允许类或接口明确控制哪些其他类可以扩展它。它有助于设计更稳定和安全的类层次结构。

示例:

java 复制代码
/**
 * 功能描述: 密封类
 * 家禽
 * 语法:
 * public abstract sealed class 父类
 * permits 指定的子类 ,Duck
 * Poultry家禽
 * Chicken ,Duck 鸡鸭
 * @author Songxianyang
 * @date 2024-10-15 10:35
 */
public abstract sealed class Poultry permits Chicken ,Duck {
    abstract void eat();
}
/**
 * 功能描述:
 * 鸭
 * @author Songxianyang
 * @date 2024-10-15 10:39
 */
public final class Duck extends Poultry{
    @Override
    void eat() {
        System.out.println("小鸭吃");
    }
}
/**
 * 功能描述:
 * 鸡
 * @author Songxianyang
 * @date 2024-10-15 10:38
 */
public final class Chicken extends Poultry{
    @Override
    void eat() {
        System.out.println("小鸡吃");
    }
}

在这个示例中,Poultry 是一个密封类,只允许 Chicken和 Duck 扩展它,限制了继承范围,增强了代码的安全性。

然而 Goose (鹅) 就提示 继承范围

3. Records Enhancements

Java 17 对 Record 进一步增强,允许在记录类中定义嵌套记录类,并改进了序列化的处理。

示例:

java 复制代码
/**
 * 记录类是不可变数据类的简洁表示方式,适用于仅包含字段、构造函数、equals、hashCode 和 toString 方法的类
 */
public record UserRecord(String name,String sex) {
}

public class Test {
    public static void main(String[] args) {
        UserRecord userRecord = new UserRecord("song", "nan");
        System.out.println(userRecord.sex());
        System.out.println(userRecord.name());
    }
}

输出:

4. Foreign Function and Memory API (Incubator)

Java 17 引入了外部函数和内存访问 API (作为孵化器项目),允许 Java 程序更安全、有效地与非 Java 代码和内存进行交互。这提供了一种与本地代码(例如 C 库)交互的机制。

示例:

使用 MemorySegment 和 MemoryAddress 来管理本机内存:

java 复制代码
import jdk.incubator.foreign.*;

public class MemoryExample {
    public static void main(String[] args) {
        try (var scope = ResourceScope.newConfinedScope()) {
            MemorySegment segment = MemorySegment.allocateNative(100, scope);
            MemoryAddress address = segment.address();
            System.out.println("Allocated memory address: " + address);
        }
    }
}

5. Strong Encapsulation by Default in JDK Internals

Java 17 加强了对 JDK 内部 API 的封装,除非显式开启,程序无法直接访问 JDK 内部的类或方法。用户需要使用 --add-opens 参数解封特定的模块或包。

示例:

plain 复制代码
--add-opens java.base/java.lang=ALL-UNNAMED

6. Deprecating the Applet API for Removal

Java 17 标记了 Applet API 为废弃,未来版本将完全移除。尽管 Applet 在早期被用于 Web 浏览器中的嵌入式应用程序,但它已过时并且不再使用。

7. New macOS Rendering Pipeline

Java 17 在 macOS 上引入了一个全新的渲染管道,使用 Apple 的 Metal API 取代了以前的 OpenGL。这提高了 macOS 上 GUI 应用的性能和可扩展性。

8. Enhanced Pseudorandom Number Generators (JEP 356)

Java 17 改进了伪随机数生成器 API,增加了更多种类的随机数生成算法,并使其更加灵活和易于使用。

示例:

java 复制代码
/**
 * 功能描述:
 * RandomGeneratorFactory 可以创建各种随机数生成器。
 * @author Songxianyang
 * @date 2024-10-15 11:08
 */
public class RandomGeneratorMain {
    public static void main(String[] args) {
        RandomGeneratorFactory.all().forEach(ss-> System.out.println(ss.name()));
        System.out.println("-------------------");
        RandomGenerator gen = RandomGeneratorFactory.of("Xoshiro256PlusPlus").create();
        System.out.println(gen.nextInt(50));// 输出 0 到 50 之间的随机数
    }
}

输出

9. Text Blocks Enhancements

虽然 Text Blocks 是 Java 13 引入的,但在 Java 17 中对其做了更多的改进,支持更好的格式化功能,减少了与传统字符串的编码问题。

示例:

java 复制代码
/**
 * 功能描述:
 * 文本块 """ 提供了一个方便的方式定义多行字符串
 * 而无需每行添加 + 或 \n
 * @author Songxianyang
 * @date 2024-10-15 10:55
 */
public class StringText {
    public static void main(String[] args) {
        String json= """
                {
                    "id": "1840575190483111937",
                    "name":"Java17"
                }
                """;
        System.out.println(json);

    }
}

输出

**10. Pattern Matching for ****instanceof**

instanceof 语句得到了增强,不再需要显式进行类型转换。

示例:

java 复制代码
/**
 * 功能描述:
 *instanceof 语句得到了增强,不再需要显式进行类型转换。
 * @author Songxianyang
 * @date 2024-10-15 10:44
 */
public class InstanceofMain {
    public static void main(String[] args) {
        Object obj = "song";
        if (obj instanceof String) {
            System.out.println("String-toUpperCase"+((String) obj).toUpperCase());
        }
    }
}

输出:

总结:

Java 17 在类型匹配、类结构控制、性能改进和安全性上都做了重大改进,尤其是引入了模式匹配、密封类、增强的随机数生成器 API,以及对本地代码的更好支持,使得代码开发更加高效、安全和简洁。

相关推荐
IT枫斗者枫哥1 小时前
MyBatis一对多分页:LIMIT 20,为什么凑不齐20个订单?
java·数据库
代码方舟1 小时前
Java数据工程:利用天远全网运营商三要素优化线上实名认证合规体验
java·人工智能
BBmmo1 小时前
我的 Java 学习笔记 · 第 7 篇:泛型与通配符
java
独泪了无痕1 小时前
Hutool之RandomUtil:随机数生成的终极利器
java·后端
花开路口1 小时前
深入理解 Java/Kotlin 协变与逆变
java·kotlin
运行时异常1 小时前
【WMS 仓储系统集成 AI Agent 实战】第 7 讲:Vue3 前端工程化——Token 刷新锁、Markdown 渲染踩坑与权限体系
java
她的男孩1 小时前
开放接口限流从 20 改到 200 还是每分钟 20 次:拆完防重放+幂等+限流,我找到 5 个静默失效的坑
java·后端·架构
天天被压力1 小时前
【Python 量化取数指南 #13】Python 把行情落库:sqlite 一键存,回测随用随取
java·人工智能·python
天天被压力1 小时前
【Python 量化取数指南 #14】Python 清洗行情数据:复权停牌对齐,回测不翻车
java·人工智能·python
独泪了无痕1 小时前
开发利器Hutool之MapUtil的使用
java·后端