Применяются ли запечатанные классы в Java и, если да, то как? - PullRequest
12 голосов
/ 16 декабря 2010

Можно определить sealed классы в Scala, которые в основном final, за исключением случаев, когда подклассификация происходит в том же файле.

Похоже, что JVM не допускает подклассы final класса и его подклассов.

Учитывая, что в байт-коде нет "понятия" исходного файла, как применяется это ограничение?

Таким образом, как javac может предотвратить подклассификацию класса Scala sealed в Java?

Ответы [ 2 ]

15 голосов
/ 16 декабря 2010

Ограничение применяется для исходного кода Scala скалаком во время компиляции.В результирующих определениях двоичного класса не установлен окончательный флаг JVM, поэтому, как вы уже, наверное, догадались, запечатанное ограничение не будет применяться javac при компиляции исходных кодов Java для двоичных файлов Scala.

1 голос
/ 09 марта 2013

Как насчет использования частного конструктора для класса, который вы хотели бы запечатать, а затем создать общедоступные конечные статические внутренние классы, расширяющие этот класс. Затем вы получаете фиксированный набор подклассов во время компиляции, который не может быть расширен в дальнейшем. Базовый класс с закрытым конструктором впоследствии служит путем для доступа к этим внутренним классам, но сам по себе его невозможно расширить и реализовать где-либо еще.

...