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();
这样做的好处是NewInterface
和OldInterface
可以是独立的接口。当开发者写一个新的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
.
在重构过程中,我需要通过添加额外参数来扩展现有接口。现在有很多旧的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();
这样做的好处是NewInterface
和OldInterface
可以是独立的接口。当开发者写一个新的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
.