Java8相关特性三

80 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第11天,点击查看活动详情

默认方法

在Java8以前,接口中不能有实现了的方法,如下

微信截图_20220607231541.png

Java8开始引入了默认方法,接口可以含有默认方法,简单的说就是接口可以有实现方法,而且不需要实现类去实现其方法。只需在方法名前面加个default关键字即可。

interface InterfaceA {
    default void printName() {
        System.out.println(this.getClass().getSimpleName());
    }
}
//实现类
class InterfaceAImpl implements InterfaceA{
}

可以看到即使InterfaceAImpl没有实现printName()方法,代码都是可以编译的。因为在InterfaceA中它有了默认实现。

类型注解

Java5开始引入了注解这一特性,使用它可以简化程序中的配置。在Java8之前,注解只能是在声明的地方所使用,比如类,方法,属性。而从Java8开始,注解中添加了类型注解,类型注解可以在任何使用类型的地方使用。 Java8中元注解@Target的参数ElementType枚举类的枚举值添加了以下两种

  1. TYPE_PARAMETER 表示该注解能写在类型变量的声明语句中,即泛型类,泛型接口,泛型方法上
  2. TYPE_USE 表示该注解可以写在任何使用类型的语句中

创建类型注解

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE_PARAMETER,ElementType.TYPE_USE})
@interface MyAnnotation {
    String value() default "hello";
}

使用类型注解

class TestAnnotation<@MyAnnotation T> {
    public void printName(T t) {
        String name = new @MyAnnotation String("name");
    }
}

可以看到注解已经不仅仅只能放在类,方法,接口上面,而是可以使用在任何地方了。

重复注解

在java8之前,如果需要在同一个元素上使用多个相同类型的注解,需要曲线救国,借助数组实现。

@interface Role {
    String role();
}
@interface Roles {
    Role[] value();
}
class Man {
    @Roles({@Role(role = "Son"), @Role(role = "Father"), @Role(role = "Husband")})
    public void role() {
    }
}

而在Java8中,开始引入了重复注解,只需要在我们定义需要重复的注解时,使用@Repeatable注解表示对应的注解是可重复的。

@Repeatable(Roles.class)
@interface Role {
    String role();
}
@interface Roles {
    Role[] value();
}
class Man {
    @Role(role = "Son")
    @Role(role = "Father")
    @Role(role = "Husband")
    public void role() {
    }
}

虽然和之前相差不大,但是提高了代码的可读性。