2012-07-18 29 views
5

は例です:Java:メソッドの特定のクラスへのアクセスを制限する方法は?ここ

class A 
{ 
    List l = new List(); 
    list.insert("x"); 
} 

class List 
{ 
    ... 
    public void insert() 
    { 
     /*insertion occurs*/ 
    } 
    ... 
} 

は、それがすべてで、インサート()メソッドを公開しておくが、それ以外のクラスがそれにアクセスできないようにAから呼び出された場合にのみ、唯一のクラスAへのアクセスを制限することは可能ですか?

+5

のインスタンスであるかどうかを確認でしょう'List'を' A'の内部クラスにします。他のクラスはそれにアクセスできません。他の方法で 'List#insert(A a)'を設定することができます –

答えて

0

プライベート

package com.my.stuff; 

class A 
{ 
    List l = new List(); 
    list.insert("x"); 

    class List 
    { 
     ... 
     protected void insert() 
     { 
     /*insertion occurs*/ 
     } 
     ... 
    } 
} 
をあなたのクラスにパッケージを追加して、メソッドを宣言し申し訳ありませんが、私はあなたがサブクラス場合は「保護」が必要だと思う...ベストは、私は信じている保護されたその内部クラスにし、使用しています。

はスコープのためのこの記事を参照してください:あなたはアクセス修飾子を使用して行うことができますhttp://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html

+0

* protected *または* default *(可視性を宣言しないことによって)パッケージの可視性を使用して、同じパッケージ内のすべてのクラスへのアクセスを制限できます。保護された可視性とデフォルトの可視性の違いは、保護されたものが子クラスのアクセスを許可することです。 –

0

最高のプライベート(publicキーワードを削除)し、同じパッケージにのみ2つのクラスを維持する方法パッケージを作ることです。

4

このメソッドがpublicであれば、誰でもアクセスできます。あなたのようなコントロールにアクセスするためのトリックは、インターフェイスを介してパブリック操作のセットを公開し、インターフェイスを実装するプライベートクラスに補助操作を追加し、クラスではなくインターフェイスにユーザープログラムを作成することです。

ここ

は一例です。

public interface MyList { 
    Object elementAt(int i); 
} 
public class A { 
    private static class MyListImpl implements MyList { 
     public Object elementAt(int i) { 
      ... 
     } 
     public void insert(Object element) { 
      ... 
     } 
    } 
    private final MyListImpl list = new MyListImpl(); 
    public MyList getList() { return list; } 
    public void insert(Object o) { list.insert(o); } 
} 

使用シナリオ:

A a = new A(); 
a.insert(123); 
a.insert("quick brown fox"); 
MyList lst = a.getList(); 
System.out.println(lst.elementAt(0)); 
System.out.println(lst.elementAt(1)); 
+0

これはC#のコードです... – unwichtich

+1

@unwichtichありがとう、私はJavaコード内のC#の癖を修正したと思います。 – dasblinkenlight

0

がAに内部クラスとしてそれを置くか、別のことを行うことができます... レッツインサートはタイプで一つのパラメータを取りますオブジェクトの先頭に、パラメータの型がA ...であるかどうかをチェックし、呼び出すときに呼び出すオブジェクトを呼び出すとき... mabyその良い考えではありませんが、あなたが望むことをします

0

前の回答のすべての「内部クラス」があなたを混乱させる場合は、より直感的な別の方法があります(extendsキーワードと継承について学習したと仮定します)。 insert()メソッドをpublicの代わりにprotectedにしてclass AListにするだけで簡単に作成できます。たとえば:

public class List { 
    ... 
    protected void insert() { 
     //insertion occurs 
    } 
    ... 
} 

public class A extends List { 
    ... 
} 

限り、他のクラスは、リストを拡張しないよう、種類AListのオブジェクトのみがこれまでinsert()メソッドを使用することができます。

+1

または同じパッケージ内のクラス。 – EJP

0

許可されたクラスに入れて非公開にします。

1
package problems; 

public class Problem1 { 
    public static void main(String[] args) { 
     B b = new B(); 
     b.methodInB(); 
     C c = new C(); 
     c.methodNotInB(); 
    } 
} 

class A { 
    public void onlyB() { 
     StackTraceElement[] stackTraceElements = Thread.currentThread() 
       .getStackTrace(); 
     if (!problems.B.class.getCanonicalName().equals(
       stackTraceElements[stackTraceElements.length - 2] 
         .getClassName())) { 
      System.err.println("You are not authorized to call me!!"); 
      return; 
     } 
     System.out.println("You are authorized to call me!!"); 
    } 
} 

class B { 
    public void methodInB() { 
     A a = new A(); 
     a.onlyB(); 
    } 
} 

class C { 
    public void methodNotInB() { 
     A a = new A(); 
     a.onlyB(); 
    } 
} 
4

私は、引数としてメソッドを呼び出しているオブジェクトを渡すすなわち

list.insert("x", this); 

そして渡されたオブジェクトは、あなたができるクラスA

public void insert (String x, Object o) 
    { 
     if(o instanceof ClassA){ 
     /*insertion occurs*/ 
     } 
    } 
+1

ちょうどsidenote:これはAを拡張するクラスのために働くでしょう... – home

+1

これは制限ではなく、誰もがメソッドのObject(または何でもクラス)のインスタンスを渡すことができます... – unwichtich

関連する問題