|
1
10
这被称为“恶意强制转换”,您可以通过一个只实现要公开的狭窄接口的包装器(通过将私有引用委托给对象,否则将直接传递给邪恶的客户机)来阻止它。 然而,如果客户不仅是邪恶的,而且是强大的,他可能会使用反射来获得隐藏的参考。 |
|
|
2
2
正常继承总是允许的,你不能用它做任何事情。如果要将某些类作为接口公开,但隐藏其他方法,请使用
|
|
|
3
1
不能。一个解决方法是实现三个代理类,一个用于实现每个接口,将所有调用转发到单个foo实例。 |
|
|
4
1
执行恶意强制转换的人会自行承担风险。在几乎所有情况下,您都可以安全地假定用户不会以指定接口约定之外的方式使用对象。 您真正需要使用代理对象的唯一时间是将安全敏感对象公开给不受信任的代码。否则,就要花时间弄清楚文档,说明如何在遵循对象的前提下使用和工作对象。 |
|
|
5
0
隐藏基础对象。 假设你有:
因此,接口A只实现了B功能的一个子集。实际上,它隐藏了B的某些部分。您的问题是如何阻止用户将A向下转换为B。
所以, 不允许用户访问B类 . 如果用户不能导入它,他就不能将其实例化或向下转换。所以,他是使用界面的力量,而不是别的。 将上述代码更改为:
然后,您可以让一个函数返回一个a,安全地知道用户不能使用b。
|
|
|
6
0
您可以使用Facade类。 这个类应该包装一个类foo的委托,然后只公开的接口方法,比如a,并将它们转发给委托。 另一方面,您可以通过声明包私有来防止强制转换到foo,并且拥有一个只返回接口a(实际上是foo)的公共工厂方法。这样就不可能从其他包中进行铸造(不过,有些人可能会玩反射的把戏)。 |
|
|
7
0
没有真正实用的、非侵入性的方法来防止这种情况发生。 然而 ,如果您的情况确实需要这种保护,请使用该实用程序类创建动态代理(委托)类(改编自 Dynamic Proxy Classes -<50行生产代码!!!)
这将导致
动态氧气.java
|
|
EarthTurtle · 调整泛型抛出迭代器的异常类型 2 年前 |
|
wallop · 实现必须明确提及所有接口字段,还是可以跳过它们? 2 年前 |
|
|
Reelie · C#11-通过抽象类在接口中静态抽象成员? 2 年前 |
|
Addem · 在OCaml签名中放入类型声明的正确方法是什么 2 年前 |