我的情况是我必须限制对类的访问。为了进一步阐述,我有两个类,比如A
和B
,它们依赖于类C
,但A
不需要使用{{1}的完整接口同样适用于C
。我所做的是,让B
实现两个不同的接口,一个接口C
可以访问,另一个接口A
可以参考。我在这做什么,这是对的吗?或者我应该记录这个?或者有更好的方法吗?
为了提供更多上下文,我试图实现一个允许插件接口的系统。而且我不希望有人访问我不想要的类的部分内容。
答案 0 :(得分:1)
您的设计没有任何问题。但是你的设计理由应该是一个清晰的设计,而不是安全性。鉴于A
和B
可以访问类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!
}
}
这通常不是问题,因为您是A
,B
和C
的程序员。你相信自己,所以你需要一个清晰的设计,但你不需要安全。
即使C
不公开且A
且B
无法直接访问该类,他们仍然可以使用反射。
因此,如果您不能信任A
和B
,因为它们是由外部方编程的(例如它们是插件),则您无法使用此设计。您必须发送实际上只实现您希望插件访问的接口的对象:
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();
}
}