2

特定のクラスで、内部的にのみ呼び出すことができるメソッドとそのサブクラスを作成するにはどうすればよいですか。

たとえば、クラス Foo:

public class Foo{
    public Foo(){

    }
    ???? void bar(){

    }
}

および Foo を拡張するクラス Baz:

public class Baz extends Foo{
    public Baz(){
        this.bar(); //valid
    }
}

また、他のランダムなクラス、Qux:

public class Qux{
private Baz baz = new Baz();
    public Qux(){
        baz.bar(); //invalid
    }
}

これらのクラスはどのパッケージにも含まれる可能性があるため、単純な「保護」は機能しないことに注意してください。

キーワードなどでこれが不可能な場合は、同様の動作を実現する方法についての提案をお待ちしています。

4

3 に答える 3

1

使用できる可視性レベルはありません。レベルはJavaで厳密にネストされており、サブクラスへのアクセスを許可するがパッケージへのアクセスを許可しないレベルはそれを壊します。

Java 1.0 には、まさにこれを行うアクセス レベル "private protected" がありましたが、言語が複雑になりあまり役に立たなかったため、後のバージョンから削除されました。同じパッケージ内のコードはあなたによって制御されます。したがって、サブクラスから身を守ることがより重要です。

于 2013-07-06T09:16:23.843 に答える
0

public別のパッケージの非拡張クラスからメソッドを呼び出すことができる唯一のキーワードです。したがって、メソッドを公開ビューから隠してクラスをどこかに配置したい場合は、リフレクションを介してメソッドを呼び出す必要があります (これはダーティです)。

于 2013-07-08T15:47:04.040 に答える
0

これは、アクセス修飾子では実際には不可能です。保護された修飾子 (同じパッケージ内のサブクラス + クラス) とデフォルトの修飾子 (同じパッケージ内のクラス) の 2 つの選択肢しかないためです。

これを達成できる唯一の方法は、保護された/デフォルトのアクセス指定子を使用して、子以外のすべてのクラスを他のパッケージに削除することです。

于 2013-07-06T09:10:57.017 に答える