我可以限制另一个类可以在Java中调用的方法吗?

时间:2013-02-05 22:30:35

标签: java interface

我们假设我有类ABC,其中类C具有可读写属性:

public class C {
    private int i = 0;

    // Writable.
    public void increment() { i++; }

    // Readable.
    public int getScore() { return i; }
}

是否可以仅让A使用increment()方法,只允许B使用getScore()方法?

6 个答案:

答案 0 :(得分:29)

不,不能分配每类访问权限。

考虑将您的类分成单独的接口,以便每个类只获得一个具有所需接口的对象。例如:

interface Incrementable { public void increment(); }
interface HasScore { public int getScore(); }
class C implements Incrementable, HasScore { /* ... */ }

class A {
  public A(Incrementable incr) { /* ... */ }
}

class B {
  public B(HasScore hs) { /* ... */ }
}

当然,有安全隐患,但这应该让你思考正确的方向。

答案 1 :(得分:6)

是的,但是你必须经历一些旋转。

public interface Incrementable {
    public void increment();
}

public interface Readable {
    public int getScore();
}

public class C implements Incrementable, Readable
{
    ...
}

现在,当您在A中定义接收对B实例的引用的方法时,请定义该方法以取代Incrementable。对于B,请将其定义为Readable

答案 2 :(得分:3)

Java有4个范围:private,protected,public和“package”。可以从任何地方访问公开的内容。仅受子类保护。私人只是那个阶级。 “package”范围未命名,但如果省略其他三个范围,则假定包范围。这只能由同一个包中的其他类访问。​​

HTH。

答案 3 :(得分:2)

不,不可能这样做。

答案 4 :(得分:2)

不是你想要的,但你可以上堆栈跟踪(创建一个异常)并检查调用你的增量方法的类。

答案 5 :(得分:1)

虽然直接的答案是否定的,但另一种解决方法(丑陋的)可以创建两个扩展第三个的接口(或者你可以将一个Object作为参数): Reader和Writer,将调用类作为参数传递给每个函数:

public interface Caller;
public interface Reader extends Caller;
public interface Writer extends Caller;


public void increment(Caller c) { 
     if (c instanceof Writer) {
         i++;
     } 
}