2012-07-18 86 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

相关问题