限制访问java中类的接口

时间:2015-10-24 07:31:33

标签: java design-patterns interface

我的情况是我必须限制对类的访问。为了进一步阐述,我有两个类,比如AB,它们依赖于类C,但A不需要使用{{1}的完整接口同样适用于C。我所做的是,让B实现两个不同的接口,一个接口C可以访问,另一个接口A可以参考。我在这做什么,这是对的吗?或者我应该记录这个?或者有更好的方法吗?

为了提供更多上下文,我试图实现一个允许插件接口的系统。而且我不希望有人访问我不想要的类的部分内容。

1 个答案:

答案 0 :(得分:1)

您的设计没有任何问题。但是你的设计理由应该是一个清晰的设计,而不是安全性。鉴于AB可以访问类C(例如,因为C是公共的),他们可以完整地访问整个对象:他们可以只是强制转换他们收到的对象C然后访问它:

public interface IA {
    void f();
}
public interface IB {
    void g();
}
public class C implements IA, IB { 
    public void f() { ... }
    public void g() { ... }        
}
public class A {
    public void doSomething(IA anIA) {
        C aC = (C) anIA;
        aC.g(); // legal!
    }
}

这通常不是问题,因为您是ABC的程序员。你相信自己,所以你需要一个清晰的设计,但你不需要安全。

即使C不公开且AB无法直接访问该类,他们仍然可以使用反射。

因此,如果您不能信任AB,因为它们是由外部方编程的(例如它们是插件),则您无法使用此设计。您必须发送实际上只实现您希望插件访问的接口的对象:

public class C { 
    public void f() { ... }
    public void g() { ... } 

    public IA getAsIO() {
        return new IA() {
            public void f() {
                C.this.f();
            }
        };
    }

    public IB getAsIB() { 
        // similar
    }
}
public class A {
    public void doSomething(IA anIA) {
        C aC = (C) anIA; // illegal
        aC.g();
    }
}