Ключевое слово permits
Ключевое слово permits используется вместе с ключевым словом sealed и указывает явный список классов или интерфейсов, которым разрешено наследоваться от данного класса или реализовывать данный интерфейс. После слова permits через запятую перечисляются имена разрешённых наследников. Каждый наследник в списке должен быть либо final, либо sealed, либо non-sealed. Если все наследники объявлены в одном файле с родителем, ключевое слово permits можно опустить - компилятор выведет список автоматически.
Синтаксис
public sealed class Parent permits Child1, Child2
{
}
Пример
Объявим sealed-класс Shape, который разрешает наследование только классам Circle и Square:
public class Main
{
public static void main(String[] args)
{
Shape circle = new Circle();
Shape square = new Square();
System.out.println(circle.name());
System.out.println(square.name());
}
}
sealed class Shape permits Circle, Square
{
public String name()
{
return "shape";
}
}
final class Circle extends Shape
{
@Override
public String name()
{
return "circle";
}
}
final class Square extends Shape
{
@Override
public String name()
{
return "square";
}
}
Результат выполнения кода:
"circle"
"square"
Пример
Если наследники объявлены в том же файле, что и sealed-класс, ключевое слово permits можно не писать - компилятор выведет разрешённых наследников сам:
public class Main
{
public static void main(String[] args)
{
Shape shape = new Triangle();
System.out.println(shape.name());
}
}
sealed class Shape
{
public String name()
{
return "shape";
}
}
final class Triangle extends Shape
{
@Override
public String name()
{
return "triangle";
}
}
Результат выполнения кода:
"triangle"
Пример
Ключевое слово permits работает и с sealed-интерфейсами. Разрешим реализацию интерфейса Animal только классам Cat и Dog:
public class Main
{
public static void main(String[] args)
{
Animal cat = new Cat();
Animal dog = new Dog();
System.out.println(cat.sound());
System.out.println(dog.sound());
}
}
sealed interface Animal permits Cat, Dog
{
String sound();
}
final class Cat implements Animal
{
@Override
public String sound()
{
return "meow";
}
}
final class Dog implements Animal
{
@Override
public String sound()
{
return "woof";
}
}
Результат выполнения кода:
"meow"
"woof"
Смотрите также
-
ключевое слово
sealed,
которое запрещает наследование посторонним классам -
ключевое слово
non-sealed,
которое открывает наследование от sealed-класса -
ключевое слово
final,
которое запрещает наследование класса -
ключевое слово
extends,
которое наследует класс от другого класса