在重构期间,我需要通过添加额外参数来扩展现有接口。现在有许多旧类实现了没有参数的版本,还有一些新类实现了带参数的版本:
void exec(int parameter);
VS
void exec();
最终,我需要接受将两个接口实现到同一个集合中的类,然后在同一个方法中进行处理。似乎有两种可能的方法:
\ 1。使用instanceof
:
int parameter = ...
if (a instanceof NewInterface)
((NewInterface) a).exec(parameter);
else
((OldInterface) a).exec();
这样做的好处是NewInterface
和OldInterface
可以是独立的接口。当开发人员编写新类时,可能更明显的是覆盖哪些方法,并且覆盖错误的方法将导致编译时错误。
\ 2。使用单个接口和定义的两个方法以及从一个方法重定向到另一个方法的父抽象类:
abstract class Common {
abstract void exec();
void exec(int param) { exec(); }
}
这允许避免在某些讨论中被认为是错误的instanceof
,但现在在每个新类中我们必须添加一个奇怪的存根:
// This is not used anymore
void exec() { };
// This is a real functionality
void exec(int param) { ...
看起来也不是最好的设计,特别是考虑到错误调用此存根的可能性。
我应该使用第三种方法,还是在使用instanceof是合理的情况下呢?
答案 0 :(得分:2)
如果您使用的是Java 8,可以使用default
implementation在界面中轻松实现它:
public interface MyInterface {
void exec();
default void exec(int param) {
exec();
}
}
exec(int)
自然可以被具体类覆盖。
另一种解决方案是拥有NewInterface extends OldInterface
。然后新类实现NewInterface#exec(int)
和OldInterface#exec()
,新客户可以选择调用哪种方法,旧客户只知道OldInterface
。