gpt4 book ai didi

java - instanceof 与重定向方法

转载 作者:行者123 更新时间:2023-11-30 03:06:56 25 4
gpt4 key购买 nike

在重构过程中,我需要通过添加额外的参数来扩展现有的接口(interface)。现在有很多老的类实现了无参版本,也有一些新的类实现了有参版本:

void exec(int parameter);

对比

void exec();

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

\1.使用instanceof:

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

这样做的好处是NewInterfaceOldInterface可以是独立的接口(interface)。当开发人员编写新类时,要重写哪些方法可能会更明显,并且重写错误的方法将导致编译时错误。

\2.使用单一接口(interface)来定义两种方法以及从一种方法重定向到另一种方法的父抽象类:

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

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

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

看起来也不像是最好的设计,特别是考虑到错误调用此 stub 的可能性。

我应该使用第三种方法吗?或者当instanceof的使用合理时就是这种情况?

最佳答案

如果您使用 Java 8,您可以使用 default implementation 在界面中轻松实现它:

public interface MyInterface {

void exec();

default void exec(int param) {
exec();
}
}

exec(int) 自然可以被具体类覆盖。

另一个解决方案是让NewInterface 扩展OldInterface。然后新类实现了NewInterface#exec(int)和OldInterface#exec(),新客户端可以选择调用哪个方法,而旧客户端只知道旧界面

关于java - instanceof 与重定向方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34528887/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com