我可以限制其他类在Java中可以调用的方法吗?

我可以限制其他类在Java中可以调用的方法吗?,java,interface,Java,Interface,假设我有类A、B和C,其中类C具有可读写属性: public class C { private int i = 0; // Writable. public void increment() { i++; } // Readable. public int getScore() { return i; } } 是否可以只让A使用increment()方法,而只让B使用getScore()方法?不可以这样做 Java有4个作用域:私有、受保护、公共和

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

public class C {
    private int i = 0;

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

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

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

不可以这样做

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

HTH.

否,无法分配每类访问权限。 考虑将类分离为单独的接口,以便每个类只获得一个具有所需接口的对象。例如:

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) { /* ... */ }
}

当然,存在安全隐患,但这应该让您朝着正确的方向思考。

是的,但您必须经历一些曲折

public interface Incrementable {
    public void increment();
}

public interface Readable {
    public int getScore();
}

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

现在,当您在A中定义接收对
B
实例的引用的方法时,请将该方法定义为采用可增量的
方法。对于
B
,将其定义为采用
可读的

尽管直接的答案是否定的,但另一个解决方法(难看的方法)可能是创建两个扩展第三个接口的接口(或者您可以将一个对象作为参数): 读写器,将调用类作为参数传递给每个函数:

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


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

这不是您想要的,但是您可以进入堆栈跟踪(创建异常)并检查调用增量方法的类。

protected
并不意味着只能从子类访问字段/方法/类。来自同一个包的类也可以使用
受保护的
。如果需要访问的类在同一个包中,它将有权访问该方法,但其他人不会。谢谢-现在等待计时器。如果他创建抽象类,然后实现这些,难道没有办法吗methods@Smit这本质上是一样的-抽象类允许您实现一些常见的细节,不过,@sdadas只是想确定一下。因此,可以使用抽象类来解决这个问题。我之所以问这个问题,是因为您引用了
,而这与回答问题或回答问题本质上是一样的。@Smit您只能扩展一个抽象类,在这个抽象类中可以实现(afaik)任意数量的接口。我相信你会想在这个问题的上下文中使用接口。也许,一些技巧会有所帮助?AspectJ的“delcare错误”构造如何?