instanceof 与重定向方法

instanceof versus redirecting methods

在重构过程中,我需要通过添加额外参数来扩展现有接口。现在有很多旧的classes实现了无参数的版本,还有一些新的classes实现了带参数的版本:

void exec(int parameter);

void exec();

最终,我需要接受 classes 将两个接口实现到同一个集合中,并在同一个方法中进行后续处理。似乎有两种可能的方法:

\1。使用 instanceof:

int parameter = ...
if (a instanceof NewInterface) 
    ((NewInterface) a).exec(parameter);
else
    ((OldInterface) a).exec();

这样做的好处是NewInterfaceOldInterface可以是独立的接口。当开发者写一个新的class时,覆盖哪些方法可能会更明显,覆盖错误的方法会导致编译时错误。

\2。使用定义了两种方法和从一种方法重定向到另一种方法的父抽象 class 的单一接口:

abstract class Common {
    abstract void exec();
    void exec(int param) { exec(); }
}

这可以避免 instanceof 在某些讨论中被认为是不好的,但现在在每个新的 class 中我们必须添加一个看起来很奇怪的存根:

 // This is not used anymore
 void exec() { };
 // This is a real functionality 
 void exec(int param) { ...

看起来也不是最好的设计,尤其是考虑到错误调用此存根的可能性。

我应该使用第三种方法,还是在合理使用 instanceof 的情况下出现这种情况?

如果您使用 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.