Классы Java Sealed для классов в разных пакетах
Если я объявлю следующую запечатанную иерархию
package a;
import b.B;
public sealed interface A permits B {
}
package b;
import a.A;
public record B() implements A {
}
без использования модулей (без module-info.java) и попробуйте скомпилировать его с помощью Maven, я получаю
[ERROR] .../src/main/java/a/A.java:[5,35] class a.A in unnamed module cannot extend a sealed class in a different package
Я знаю https://openjdk.java.net/jeps/409 и этот раздел:
The classes specified by permits must be located near the superclass: either in the same
module (if the superclass is in a named module) or in the same package (if the
superclass is in the unnamed module).
но не должен ли maven по умолчанию использовать путь к классам при компиляции? Можно ли вообще избежать этого ограничения?
Если нет, не создает ли это прецедент, когда функция на пути к модулю более гибкая, чем на пути к классу, и это, в свою очередь, - хотя путь к классам все еще поддерживается, он не такой первоклассный, как раньше, по сравнению с путем к модулю ?
1 ответ
Путь к классам - это безымянный модуль.
Мотивация состоит в том, что закрытый класс и его (прямые) подклассы тесно связаны, поскольку они должны компилироваться и поддерживаться вместе. В модульном мире это означает «тот же модуль»; в немодульном мире лучшим приближением для этого является «тот же пакет».
Так что да, если вы используете модули, вы получаете дополнительную гибкость, потому что модули границ безопасности предоставляют вам.