3

私の知る限り、クラスにアクセス修飾子がある場合、Java 内部パッケージの保護されたアクセス修飾子 ( internal protectedC# など) でクラス メンバーに追加する古典的な方法は不可能publicです。これを行う方法やデザインパターンを知っていますか?

Java でこれを行うための構文サポートがないのはなぜですか? (または、なぜ C# にあるのですか?)

4

1 に答える 1

3

Java では、最も近いのはprotected、クラス メンバーおよびクラスの単純な修飾子ですpackage private。同じパッケージからのアクセスだけでなく、継承クラスからのアクセスも許可します。

internal実際には、このパッケージのクラスを直接使用してはならないことをクライアントに示唆するような名前が Java パッケージに付けられていることがわかります。

UPD

コンパイル時にそのような制限を強制する方法はありません。ただし、実行時には、Java セキュリティの使用、リフレクション、スタック トレースの分析など、さまざまなオプションがあります。ただし、各コンテキストで各ソリューションの長所と短所を評価する必要があります。

楽しみのために、これを試すことができます(これが実際のプロジェクトで役立つとは思えません。また、これがバイトコード生成プロキシまたは他のエキゾチックなユースケースでどれほどうまく機能するかはわかりません):

public class Test {
     public void protectedInternal() {
         // If this method is not called from an inherited class.
         if (getClass() == Test.class) {
             StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
             StackTraceElement e = stackTrace[2]; // Corresponds to the caller stack frame.
             // Check the caller is from the allowed package.
             if (!e.getClassName().startsWith("my.package.")) {
                 throw new SecurityException("Sorry, this method is kind of protected internal :)");
             }
         }
     }
}
于 2014-05-27T12:17:29.507 に答える