爽呀,JDK17里面可以使用的神仙语法(三)

平台奖励创作,可能会升级VIP文章,可以移步我的公众号:【编程朝花夕拾】,且可获取首发内容。

01 引言

今天又整理了一些JDK17里面能用的语法糖,关于继承关系以及方法扩展。

02 神仙语法

2.1 密封类关键词

关于继承关系安全性的一类语法,旨在细粒度的控制类的继承关系。该语法来自JDK15。

先回顾一下历史,我们都知道Java的三大特点,封装、继承和多态。只要一个类没有被final 关键词修饰,就可以被继承。

// final 修饰的类
public final class Plane {
	// ...
}

如果继承后就会编译不通过,如图:

JDK17中final关键词依然可以使用,只是额外增加了sealedpermitsnon-sealed关键字。

  • sealed 声明类不可以被继承,不能单独使用,需要指定可以被继承的类,通过permits指定。
  • permits 声明不可继承的类,允许的类。
  • non-sealed 声明此类可以被任何类继承。继承了被sealedpermits修饰的类后,必须使用该关键词或final关键字显示声明当前类是否允许被继承。
// 声明Animal类只能被Cat和Dog集成
public sealed class Animal permits Cat, Dog {
    public void eat() {}
}

// Cat 使用final 关键字声明不可被其他类再次继承
public final class Cat extends Animal {
    @Override
    public void eat() {
        System.out.println("猫咪吃猫粮");
    }
}

// Dog 使用non-sealed 关键字声明可以被任何类再次继承
public non-sealed class Dog extends Animal{
    @Override
    public void eat() {
        System.out.println("狗狗吃狗粮");
    }
}

2.2 密封接口关键词

因为接口可以相互继承,所以也适用于接口的继承。在JDK17里面,实现类和接口之间也可以指定密封接口的实现关系。因为关键字相同,这里就不在赘述,直接看案例。

// 声明接口是能被Bird和Plane实现
public sealed interface Fly permits  Bird, Plane {
 	void fly();
}

//Bird 使用non-sealed 关键字声明可以被任何类再次继承
public non-sealed class Bird implements Fly{
    @Override
    public void fly() {
        System.out.println("小鸟飞行");
    }
}

// Plane 使用final 关键字声明不可被其他类再次继承
public final class Plane implements Fly {
    @Override
    public void fly() {
        System.out.println("飞机飞行");
    }
}

2.3 接口的中的私有方法

我们都知道JDK8中增加接口default关键字可以编写方法,在JDK9中可以编写private关键字的私有方法。因为方法私有不能被外部方法调用,只能通过接口的默认方法调用。所以detaultprivate关键字就可以搭配使用了。

// 接口
public sealed interface Fly permits  Bird, Plane {
	// 私有方法
    private void test() {
        System.out.println("test 执行了");
    }

    // 默认方法
    default void test2() {
        test();
    }

	// 接口
    void fly();
}

// 实现类
public final class Plane implements Fly {

    @Override
    public void fly() {
        System.out.println("飞机飞行");
    }

    @Override
    public void test2() {
        Fly.super.test2();
    }
}

// 私有方法调用
Fly plane = new Plane();
plane.test2();

2.4 String 方法增强

String.strip()String.isBlank()String.isEmptyString.lines()String.repeat()等方法。

String str = """
            hello world
            hello world hello world
            hello world  
            """;
// 按照行分割    
str.lines().forEach(System.out::println);
// 判断字符串是否为空
System.out.println(str.isBlank());
System.out.println(str.isEmpty());
// 字符串重复拼接
System.out.println(str.repeat(2));

Character c = '\u2000';
String str1 = c + "abc" + c;
// 去除前后的空白,但是无法去除Unicode空白字符
System.out.println(str1.trim());
// 输出结果: abc 
// 可以去除Unicode空白字符
System.out.println(str1.strip());
// 输出结果:abc

2.5 Stream接口新增toList()

之前Stream转换为List都需要使用Collectors.toList(),现在不需要了,该方法来自JDK17。

// JDK17之前的写法
List<Integer> list = Stream.of(1, 2, 5, 6, 7, 8, 9, 10).collect(Collectors.toList());

// JDK17的写法
List<Integer> list = Stream.of(1, 2, 5, 6, 7, 8, 9, 10).toList();

03 小结

我们可以看到JDK的发展一直在拥抱变化,吸收其他语言比较好的语法加入到JDK中、如sacla、python、js等语言。更加细粒度的控制使用的类,增加安全性。

只不过更新了这么多东西,使用者能不能记住呢?太难了,学习不能停,继续学!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

智_永无止境

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值