我需要在Java中进行一些重构,我需要保持一定程度的二进制兼容性。在这种情况下,我想删除一些遗留接口,这些接口不再在任何地方使用,并且需要相当大的(也是不赞成的)外部依赖。
我有实现接口C
的类I
,我有一个代码调用C
实例上的方法(在接口中声明)。调用代码知道它正在使用C
,而不仅仅是接口。
class C implements I {
void theMethod(){} ; // is declared in the interface I
}
C object;
object.theMethod();
当我从类定义中删除接口(但保留所有方法)时,调用代码(根本不涉及接口)是否仍然有效(没有重新编译)?
答案 0 :(得分:5)
是的,它会起作用 - 只要它没有在任何地方明确引用接口I
。
来自JLS: Resolution of Symbolic References:
类的二进制表示 或接口引用其他类 和接口及其领域, 方法和构造函数 象征性地,使用二进制名称 (§13.1)其他类和 接口
引用类ClientClass
的字段/方法的类C
不包含对该类可能实现的接口I
的隐式引用。
答案 1 :(得分:2)
只要类C
的对象永远不会被称为I
,它就会起作用。
答案 2 :(得分:1)
如果它在任何地方导入接口,您可能会遇到调用代码的问题。如果任何调用代码中没有import
接口,您可以合理地确信您的重构将按计划运行。