0

外界からの B Class オブジェクトの作成を回避し、 A Class のみを許可するにはどうすればよいですか?

私は2つのクラスを持っています

public class A {
    B obj = null;
    public A() {
        obj = new B();
    }        
    public void methodA () {
        obj.methodB();
    }        
    // other methods
}

public class B {
    public void methodB () {
        // some logic            
    }
    //other methods
}

public class Client {
    public static void main (String s[]) {
        // Valid Call            
        A obj = new A();
        obj.methodA();  // Since methodB is called internally

        // Invalid Call , How to restrict this B object creation here ?
        B objB = new B();
        objB.methodB();

    }
}
4

9 に答える 9

2

私が考えることができる1つの解決策は、Aの内部静的クラスを使用することです。プライベートコンストラクターでKeyToBを使用します。これは、Bがインスタンス化するために必要です。したがって、別のファイルに存在する可能性のあるBをインスタンス化できるのはAだけです。

public class A {
    B obj = null;
    public A() {
        obj = new B(instance);
    }
    public void methodA() {
        obj.methodB();
    }
    // other methods ..

    //The key to have the right to instanciate B, only visible in A
    private static KeyToB instance = new KeyToB();

    public static class KeyToB{
        private KeyToB() {
        }
    }
}

public class B {
    //The constructor is package visible, it need a non null instance of KeyToB . If someone use new B(null), it will get a RuntimeException
    B(KeyToB instance) {
        if (instance == null){
            throw new IllegalArgumentException("B can only be instanciated by A");
        }
    }
    public void methodB() {     
    }   
}
于 2012-08-08T07:21:26.957 に答える
1

クラスBをクラスAの内部クラスとして作成し、クラスBのスコープをプライベートとして指定してみてください

class A {
    B b = null;
    public A() {
    b = new B();    
    }
     public void testA() {
       return b.methodB();
     }

    private class B {

         public void methodB () {             
                   // some logic                     
         }  

    }
}

http://docs.oracle.com/javase/tutorial/java/javaOO/innerclasses.html

于 2012-08-08T07:16:45.217 に答える
1

の概念を使用しInner Classます。

Privateのメンバー(つまり、エンクロージング クラスOuter Class )、その中のすべて Inner Class (つまり、エンクロージング クラス)からアクセス可能であり、その逆も同様です。

したがってClass A外部クラスになりClass Bprivate 内部クラスとして

public  class A {

        B obj;

        public A() {

        obj = new B(); 

        }


        private class B {

             public void methodB () {             

             }  

        }
    }
于 2012-08-08T07:46:24.763 に答える
0

BクラスをAと同じパッケージに入れ、そのコンストラクターをパッケージで保護します。同じパッケージのクラスのみがそれを呼び出すことができます。

于 2012-08-08T07:15:22.413 に答える
0

プライベートコンストラクタを使用しBての内部(静的)クラスを作成できます。A

class B {

    public A createA() {
        A a = new A();
        return a;
    }

    public static class A {
        private A() {}
    }

}
于 2012-08-08T07:16:34.320 に答える
0
public class A {

    private class B{

        private B(){

        }       
    }

    public B createB(){
        return new B();
    }

}
于 2012-08-08T07:21:42.917 に答える
0

ここに解決策があります..

public class A {

    public static boolean isFromAClass = false;
    B obj = null;

    public A() {
        try {
            isFromAClass = true;
            obj = new B();
            isFromAClass = false;
        } catch (Exception e) {
        }
    }

    public void methodA() {
        System.out.println("methodA");
        obj.methodB();
    }
    // other methods
}

public class B {

    public B () throws Exception {
        if(!A.isFromAClass) {
            throw new Exception();
        }
    }
    public void methodB() {
        System.out.println("methodB");
        // some logic
    }
    //other methods
}

public class Client {

    public static void main(String s[]) throws Exception {
        // Valid Call
        A obj = new A();
        obj.methodA();  // Since methodB is called internally

        // Invalid Call , How to restrict this B object creation here ?
        B objB = new B(); // this line throws Exception
        objB.methodB();

    }
}

A、B、Client クラスはどのパッケージに含まれていてもかまいません。

public static boolean isFromAClass = false; を使用します。フィールド、それは達成されます。

OutSideAClassBClassInstanceShouldNotBeCreatedとして例外をカスタマイズする必要があります。

于 2012-08-08T07:41:22.547 に答える
0

A簡単な解決策は、 と の両方をBサンプル パッケージに入れることです。次に、クラスをBpublic にしますが、そのコンストラクターはpackageor にアクセスしprotectedます。

クラスAは次のようになります。

package my;
public class A {}

クラスBは次のようになります。

package my;
public class B {
   B() {}
}

クラスBがパッケージ外で実際に必要ない場合は、クラス自体をパッケージ アクセスにすることもできます。

于 2012-08-08T07:14:29.080 に答える
0

プライベートな静的ネスト クラスを使用できます。

    public class A {
        private static class B {
            public void methodB () {
                // some logic            
            }
            //other methods
        }

        B obj = null;

        public A() {
            obj = new B();
        }        
        public void methodA () {
            obj.methodB();
         }        
         // other methods
   }
于 2012-08-08T07:17:33.213 に答える