gpt4 book ai didi

java - 在Java接口(interface)实现中避免使用instanceof

转载 作者:行者123 更新时间:2023-12-02 05:51:01 24 4
gpt4 key购买 nike

假设以下情况:

public interface A {
void a1();
void a2();
}

public interface B {
void b1(A a);
}

public class ImplA implements A {
// interface methods
void a1() {};
void a2() {};
// ImplA specific methods
void a3() {};
}

public class ImplB implements B {
void b1(A a) {
if(a instaceof ImplA) { // avoid instanceof test and cast
((ImplA)a).a3();
}
}
}

是否可以通过某种架构巫毒来避免 ImplB.b1() 中的 instanceof 检查? ImplA和ImplB在同一个包中,并且彼此密切相关。我在某处读到,使用 instanceof 暗示了“不太好的”界面设计。有什么建议吗?非常感谢!

最佳答案

您可以使用访问者模式来避免实例转换

public interface Visitor {
void visitImplA(ImplA toVisit);
}

public class VisitorImpl implements Visitor {

@Override
public void visitImplA(ImplA toVisit) {
toVisit.a3();
}
}

public interface A {
void a1();
void a2();
void accept(Visitor visitor);
}

public interface B {
void b1(A a);
}

public class ImplA implements A {
// interface methods
void a1() {};
void a2() {};
// ImplA specific methods
void a3() {};

void accept(Visitor visitor) {
visitor.visitImplA(this);
}
}

public class ImplB implements B {
void b1(A a) {
a.accept(new VisitorImpl());
}
}

这将消除所有的instanceof检查并将它们划分为访问者和实现类,如果您在大多数instanceof检查后执行相同的操作,这种模式就足够了,否则您需要一个许多 Visitor 接口(interface)的实现

关于java - 在Java接口(interface)实现中避免使用instanceof,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23534423/

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