簡體   English   中英

不同包中類的密封類

[英]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 {

}

不使用模塊(沒有 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和本節:

由 permit 指定的類必須位於超類附近:在同一個模塊中(如果超類在命名模塊中)或在同一個包中(如果超類在未命名模塊中)。

但是,Maven 在編譯時不應該默認使用類路徑嗎? 能否完全避免這種限制?

如果不是,這不是開創了一個先例,其中模塊路徑上的功能比類路徑上的功能更靈活,反過來 - 雖然仍然支持類路徑,但與模塊路徑相比,它不像以前那樣是一等公民?

類路徑未命名的模塊。

動機是密封類及其(直接)子類是緊密耦合的,因為它們必須一起編譯和維護。 在模塊化世界中,這意味着“相同的模塊”; 在非模塊化世界中,對此的最佳近似是“相同的包”。

所以是的,如果您使用模塊,您會獲得一些額外的靈活性,因為模塊為您提供了安全邊界。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM