在不同的包装中密封 类 用于 类
Sealed classes for classes in different packages
如果我声明以下密封层次结构
package a;
import b.B;
public sealed interface A permits B {
}
package b;
import a.A;
public record B() implements A {
}
不使用模块(没有模块-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 在编译时不应该默认使用 classpath 吗?完全可以避免这种限制吗?
如果不是,这是否开创了一个先例,模块路径上的功能比 class 路径上的功能更灵活,反过来 - 虽然 classpath 仍然受支持,但它不是与模块路径相比,作为第一个 class 公民?
class路径是未命名的模块。
动机是密封的 class 及其(直接)子 class 紧密耦合,因为它们必须一起编译和维护。在模块化世界中,这意味着“相同的模块”;在非模块化世界中,最好的近似是“相同的包”。
所以是的,如果你使用模块,你会得到一些额外的灵活性,因为模块给了你安全边界。
如果我声明以下密封层次结构
package a;
import b.B;
public sealed interface A permits B {
}
package b;
import a.A;
public record B() implements A {
}
不使用模块(没有模块-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 在编译时不应该默认使用 classpath 吗?完全可以避免这种限制吗?
如果不是,这是否开创了一个先例,模块路径上的功能比 class 路径上的功能更灵活,反过来 - 虽然 classpath 仍然受支持,但它不是与模块路径相比,作为第一个 class 公民?
class路径是未命名的模块。
动机是密封的 class 及其(直接)子 class 紧密耦合,因为它们必须一起编译和维护。在模块化世界中,这意味着“相同的模块”;在非模块化世界中,最好的近似是“相同的包”。
所以是的,如果你使用模块,你会得到一些额外的灵活性,因为模块给了你安全边界。