2012-07-18 160 views
5

下面是一個例子:Java:如何限制某個方法對特定類的訪問?

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

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

是否有可能在所有保持insert()方法公開,但限制只能訪問類A,這樣其他類都可以訪問它,從一個名爲只有當?

+5

你可以使'List'成爲'A'中的內部類,所以沒有其他類可以訪問它。其他方式可以設置'List#insert(A a)' – 2012-07-18 20:08:50

回答

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 *(通過不聲明可見性)包的可見性來限制對同一包中所有類的訪問。受保護的和默認的可見性之間的區別在於受保護的允許訪問兒童課程。 – 2012-07-18 20:15:13

0

您可以使用訪問修飾符做的最好的是使該方法包私有(刪除public關鍵字),只保留這兩個類在同一個包。

4

如果該方法是公開的,則每個人都可以訪問它。像你一樣訪問控制的技巧是通過接口公開一組公共操作,向實現該接口的私有類添加輔助操作,並使用戶程序訪問接口而不是類。

下面是一個例子:

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 2014-03-03 14:59:53

+1

@unwichtich謝謝,我想我修復了Java代碼中的C#主題。 – dasblinkenlight 2014-03-03 15:05:24

0

把它作爲內部類中的一個或者你可以做的另一件事...... 讓插入需要與類型的一個參數的對象,並在它的開始檢查,如果參數的類型是A ....當你打電話給它發送呼叫對象... 馬比它不是一個好主意,但它會做你想做的事

0

如果之前答案中的所有「內部類」內容都讓你感到困惑,還有另一種更直觀的方法(假設你已經瞭解了關鍵字和繼承關係)。您可以簡單地使insert()方法protected而不是public並使class A延伸List。例如:

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

public class A extends List { 
    ... 
} 

只要沒有其他類擴展列表中,只有類型AList對象將永遠能夠使用insert()方法。

+1

或同一包中的類。 – EJP 2012-07-18 22:53:39

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); 

然後檢查是否傳遞的對象是類的一個實例

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

只是一個註釋:這將適用於擴展A的類... – home 2012-10-15 12:52:17

+1

這不是限制,每個人都可以傳遞Object(或任何類)的實例給方法... – unwichtich 2014-03-03 14:53:01

相關問題