Ключевое слово permits в Java
После объявления sealed class или sealed interface
можно указать ключевое слово permits и через запятую
перечислить типы, которым разрешено наследование или
реализация. Каждый указанный тип должен быть final,
sealed или non-sealed:
sealed class Post permits DraftPost, PublishedPost {
}
final class DraftPost extends Post {
}
final class PublishedPost extends Post {
}
Создадим DraftPost и убедимся, что это не PublishedPost:
Post post = new DraftPost();
System.out.println(post instanceof PublishedPost);
Тот же список задают для запечатанного интерфейса -
в permits перечисляют классы, которые его
реализуют:
sealed interface PostAction permits SaveAction, PublishAction {
}
final class SaveAction implements PostAction {
}
final class PublishAction implements PostAction {
}
Создадим PublishAction и выведем короткое имя его класса:
PostAction action = new PublishAction();
System.out.println(action.getClass().getSimpleName());
Если все наследники или реализации объявлены в том же
файле, что и запечатанный тип, permits можно
опустить - компилятор составит список сам. Явная запись
удобна, когда список нужно видеть сразу в заголовке типа:
final class ArchivedPost extends Post {
}
Спросим у класса Post, запечатан ли он, и выведем ответ:
System.out.println(Post.class.isSealed());
Объявите sealed class Employee permits Intern, Staff
и оба final подтипа.
Сохраните new Intern() в переменную Employee
и выведите результат instanceof Intern.
Объявите sealed interface Role permits GuestRole, UserRole
с двумя final реализациями.
Создайте new UserRole(), сохраните в Role
и выведите простое имя класса.