【发布时间】:2016-04-06 16:01:00
【问题描述】:
我有以下域对象:
public interface Event {}
public class FirstEvent {}
public class SecondEvent {}
然后我有另一个模块,它应该与我的域对象完全解耦,这意味着它知道域对象,但域对象不应该知道这个附加模块的存在。
在这个模块中,我通过公共接口Event 接收对象,我需要根据特定的事件类型采取不同的行动。
目前我的代码如下所示:
if (event instanceof FirstEvent.class) {
doFirst();
}
else if (event instanceof SecondEvent.class) {
doSecond();
}
它工作正常,但静态分析工具和代码审查者抱怨我不应该使用instanceof,我应该用更多面向对象的方法来替换它。反射或getClass() 也不是一个选项。
如何在 Java 中做到这一点?
我已经查看了许多关于替换 instanceof 的现有问题,但他们都建议将一些逻辑直接添加到域对象中。但是,在这种情况下,我不想用特定于我的模块的逻辑来污染它们。
【问题讨论】:
-
为什么不能从
Event实现FirstEvent和SecondEvent然后调用方法? -
我认为没有第三种选择。 99% 的情况下,我会同意代码审查员的观点,即您应该使用继承而不是
instanceof或getClass,但也有例外。 -
@DeendayalGarg 不确定我是否理解您的问题。
FirstEvent和SecondEvent已经在另一个模块中实现。 -
@PaulBoddington 这对我来说也是一个正确的答案,至少当他们开始抱怨时我会在代码审查期间得到一些支持
-
访问者模式呢?
标签: java design-patterns instanceof dynamic-dispatch