JDK17的新特性

【注】需要关注的版本LTS(Long term support)长期支持版本目前JDK17 版本是长期支持版本

新特性1:jdk17对swtich语句增强

package jdktest;


public class SwitchExample {
    public static void main(String[] args) {
        int dayOfWeek = 3; // 假设今天是星期三
        Integer LLL = 1;
        extracted(dayOfWeek);

        extracted1(dayOfWeek);

        extracted2(dayOfWeek);

        String s = extracted3(LLL);
        System.out.println(s);
    }

    /**
     * 初始写法
     *
     * @param dayOfWeek
     */
    private static void extracted(int dayOfWeek) {
        switch (dayOfWeek) {
            case 1:
                System.out.println("今天是星期一");
                break;
            case 2:
                System.out.println("今天是星期二");
                break;
            case 3:
                System.out.println("今天是星期三");
                break;
            case 4:
                System.out.println("今天是星期四");
                break;
            case 5:
                System.out.println("今天是星期五");
                break;
            case 6:
                System.out.println("今天是星期六");
                break;
            case 7:
                System.out.println("今天是星期日");
                break;
            default:
                System.out.println("输入的数字不在1到7之间");
                break;
        }


    }

    /**
     * jdk14 引入的新写法
     *
     * @param dayOfWeek
     */
    private static void extracted1(int dayOfWeek) {
        switch (dayOfWeek) {
            case 1 -> System.out.println("今天是星期一");
            case 2 -> System.out.println("今天是星期二");
            case 3 -> System.out.println("今天是星期三");
            case 4 -> System.out.println("今天是星期四");
            case 5 -> System.out.println("今天是星期五");
            case 6 -> System.out.println("今天是星期六");
            case 7 -> System.out.println("今天是星期七");
            default -> System.out.println("异常");
        }
    }

    /**
     * jdk17 增强
     *
     * @param dayOfWeek
     */
    private static void extracted2(int dayOfWeek) {
        switch (dayOfWeek) {
            case 1, 2, 3, 6 -> System.out.println("今天是星期一");
            default -> System.out.println("异常");
        }

        switch (dayOfWeek) {
            case 1, 2, 3, 6 -> {
                System.out.println(2555);
                // 支持 方法块
                extracted1(dayOfWeek);
            }
            default -> System.out.println("异常");
        }
    }

    /**
     * jdk17 引入的新写法
     *
     * @param o
     */
    private static String extracted3(Object o) {
        return switch (o) {
            case null -> "o is null ";
            case Integer i -> String.format("Integer i : %s", i);
            default -> o.toString();
        };
    }
    /**
     * private static String extracted3(Object o) { ... }:这是一个静态方法 extracted3,它接受一个 Object 类型的参数 o 并返回一个 String。
     * return switch (o) { ... };:这里使用 switch 表达式来决定返回哪个字符串。switch 表达式在这里用作返回值,这与传统的 switch 语句不同,后者不能直接返回值。
     * case null -> "o is null ";:如果传入的参数 o 是 null,则 switch 表达式返回 "o is null "。
     * case Integer i -> String.format("Integer i : %s", i);:如果传入的参数 o 是 Integer 类型,则 switch 表达式将其解包为一个名为 i 的 Integer 对象,并返回格式化的字符串 "Integer i : " + i.toString()。
     * default -> o.toString();:如果传入的参数 o 不匹配上述任何情况,则 switch 表达式返回 o 的字符串表示形式。
     */

}

优点:大大开发了,我们开发的效率,可阅读性增强

新特性2:instanceof

package jdktest;

class Animal {
    void makeSound() {
        System.out.println("Some sound");
    }
}

class Dog extends Animal {
    void makeSound() {
        System.out.println("Bark");
    }
}

/**
 * instanceof 增强
 */
public class InstanceOfExample {
    public static void main(String[] args) {
        Animal myAnimal = new Dog(); // 创建 Dog 对象,但将其赋值给 Animal 类型的引用

        if (myAnimal instanceof Dog) {
            System.out.println("myAnimal is a Dog");
            // 由于 myAnimal 确实是 Dog 的实例,我们可以安全地进行向下转型
            Dog myDog = (Dog) myAnimal;
            myDog.makeSound(); // 输出 "Bark"
        } else {
            System.out.println("myAnimal is not a Dog");
        }

        Object o = 1;

        if (o instanceof Integer i) {
            System.out.println(i.intValue());
        }
    }
}

新特性3:密封类 Sealed Classes(限制继承类),用来修饰父类、接口上

定义四个类

People、Man、Woman 、Dog

public sealed class People permits Man ,Woman{
}
public final class Man extends People {
}
public non-sealed class Woman extends People {
}

Dog 类继承People就会报错

//public class Dog extends People{
//}

注意点:

1.父类必须使用sealed 和 permits 关键字

2.子类必须使用 final 或 non-sealed

3.final: 无法再被子类继承

4. non-sealed 可以再被子类继承

5.相关类必须在同一个包中

优点:安全,限制了继承。可控,只有当前包中的类可用。

新特性5 Record类(类似lombok的属性只读对象)

特点

  1. 不可变性record 类是隐式不可变的,这意味着一旦创建了 record 实例,其状态就不能更改。

  2. 简洁性:与传统的 Java 类相比,声明 record 类需要更少的代码。

  3. 自动实现record 类会自动为所有声明的组件生成构造器、访问器(getter)、equals()hashCode() 和 toString() 方法。

  4. 组件声明record 类通过声明一个或多个组件来定义其状态。这些组件就像是类的字段,但不需要显式声明为字段。

  5. 紧凑的声明方式record 类的声明看起来像是创建一个实例,组件名在 record 关键字之后列出。

public record RecordExampleBean(String name, String year) {
}
public class RecordExample {

    public static void main(String[] args) {
        RecordExampleBean bean = new RecordExampleBean("1", "d");
        RecordExampleBean bean1 = new RecordExampleBean("1", "d");
        RecordExampleBean bean2 = new RecordExampleBean("3", "d");
        bean.name();
        bean.year();
        boolean equals = bean.equals(bean1);// true
        boolean equals1 = bean1.equals(bean2);// false
        System.out.println(equals);
        System.out.println(equals1);

    }

}

record类能实现接口吗?

import java.util.Comparator;

public record Person(String name, int age) implements Comparable<Person> {
    @Override
    public int compareTo(Person other) {
        return Integer.compare(this.age, other.age);
    }
}

public class RecordInterfaceExample {
    public static void main(String[] args) {
        Person person1 = new Person("张三", 30);
        Person person2 = new Person("李四", 25);

        int comparisonResult = person1.compareTo(person2);
        System.out.println("比较结果:" + comparisonResult);
    }
}

在这个例子中,Person 是一个 record 类,它实现了 Comparable 接口。实现 Comparable 接口的 record 类必须提供一个 compareTo 方法,用于比较两个对象的大小。在这个例子中,我们根据年龄来比较两个 Person 对象。

需要注意的是,record 类不能有实例字段,只能有组件。因此,实现接口时,如果接口需要实例字段,record 类将无法直接实现该接口。但是,如果接口只依赖于类的方法,record 类可以轻松地实现它。

【注意】record 使用场景有限 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值