3

と の 3 つのクラス class1があるclass2としclass3ます。

( )class1によってのみインスタンス化でき、class3 または他のクラスによってはインスタンス化できないようにするにはどうすればよいですか?class2class1 object = new class1()

修飾子で動作するはずだと思いますが、よくわかりません。

4

4 に答える 4

2

あなたのクラスの名前をFriendShyおよびに変更したいと思いますStranger。はFriendを作成できるはずですが、作成できShyないStrangerはずです。

このコードは次のようにコンパイルされます。

package com.sandbox;

public class Friend {

    public void createShy() {
        Shy shy = new Shy();
    }

    private static class Shy {

    }

}

しかし、このコードはしません:

package com.sandbox;

public class Stranger {

    public void createShy() {
        Friend.Shy shy = new Friend.Shy();
    }

}

さらに、 という新しいクラスを作成するとFriendsChild、これもコンパイルされません。

package com.sandbox;

public class FriendsChild extends Friend {

    public void childCreateShy() {
        Shy shy = new Shy();
    }

}

そして、この命名規則は、よく考えると理にかなっています。私が誰かの友達だからといって、私の子供がその人を知っているとは限りません。

これらのクラスはすべて同じパッケージに含まれていることに注意してください。私が理解できる限り、これはあなたが探しているシナリオです。

于 2013-01-16T19:43:43.740 に答える
1

コンストラクターを保護する以外の別のオプション:

  • コンストラクターをclass1非公開にする
  • class2のインスタンスを返すために有効なインスタンスを必要とする public static factory メソッドを作成します。class1
于 2013-01-16T19:37:43.880 に答える
0

アップデート

コンストラクターを作成protectedし、適格なクラスを同じパッケージに入れます。パッケージ外のクラスでこのインスタンスを構築する場合はClassA、この例でそのクラスを拡張する必要があります。

制限する場合は、defaultアクセス指定子を使用してください

package com.somthing.a;
public class ClassA {

    ClassA() {
        super();
        // TODO Auto-generated constructor stub
    }
}

package com.something.a;
public class ClassB {
    public static void main(String[] args) {
        new ClassA();//valid
    }
}


package com.something.c;
public class ClassC {
    public static void main(String[] args) {
        new ClassA();// invalid
    }
}
于 2013-01-16T19:35:31.410 に答える
0

class1 を class2 の内部クラスにします。

于 2013-01-16T19:38:41.947 に答える