密封类是java15第一次预览,java17正式确定。Java15的密封类是一种确定了子类的类。这个改变是巨大的,以往的Java版本根本无法确定到底有哪些子类。而在java15中,如果定义了一个类为密封类就可以确定有哪些直接子类了。如下面的例子:
public sealed class PageQuery permits HouseQuery {private int page;private int size;public int getPage() {return page;}public void setPage(int page) {this.page = page;}public int getSize() {return size;}public void setSize(int size) {this.size = size;}
}
我这个类就有个确定的房屋查询子类:
public final class HouseQuery extends PageQuery {private String building;public String getBuilding() {return building;}public void setBuilding(String building) {this.building = building;}
}
子类
密封类的子类必须定义为final/sealed/non-sealed三种类型。这三种类型各有特点,final类是没有子类的,无需过多解释。non-sealed类是为了扩展,而sealed类是为了限定扩展。以下是一个non-sealed的例子:
@Data
public sealed class PageQuery permits AreaQuery {private int page;private int size;}
@Data
public non-sealed class AreaQuery extends PageQuery {private String province;private String city;private String county;
}
密封接口
我个人感觉密封接口的好处是可以马上知道有哪些实现类:
public sealed interface HouseService permits HouseServiceImpl {
}
其实现类:
public non-sealed class HouseServiceImpl implements HouseService{
}
反射API
新的反射API可以获取密封类的子类:
public class SealedDemo {public static void main(String[] args) {Class<PageQuery> clazz = PageQuery.class;System.out.println(clazz.isSealed());Class<?>[] subclasses = clazz.getPermittedSubclasses();for (Class<?> subclass: subclasses) {System.out.println(subclass);}}
}
结果为:
true
class com.lintongai.java21demo.sealed.AreaQuery