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

时间:2024-10-25 07:46:42

在这里插入图片描述

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

代码结构图

1. Pattern Matching for switch (Preview)

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

示例:

/**
 * 功能描述:
 *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

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

示例:

/**
 * 功能描述: 密封类
 * 家禽
 * 语法:
 * 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 进一步增强,允许在记录类中定义嵌套记录类,并改进了序列化的处理。

示例:

/**
 * 记录类是不可变数据类的简洁表示方式,适用于仅包含字段、构造函数、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 库)交互的机制。

示例:
使用 MemorySegmentMemoryAddress 来管理本机内存:

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 参数解封特定的模块或包。

示例:

--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,增加了更多种类的随机数生成算法,并使其更加灵活和易于使用。

示例:

/**
 * 功能描述:
 * 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 中对其做了更多的改进,支持更好的格式化功能,减少了与传统字符串的编码问题。

示例:

/**
 * 功能描述:
 * 文本块 """ 提供了一个方便的方式定义多行字符串
 * 而无需每行添加 + 或 \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 语句得到了增强,不再需要显式进行类型转换。

示例:

/**
 * 功能描述:
 *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,以及对本地代码的更好支持,使得代码开发更加高效、安全和简洁。