我的类 Query
中有一个接口(interface)类型为 Criteria
的 List
。
List<Criteria> criteria = new ArrayList<Criteria>();
我有几个Criteria
的具体实现。我想为 Query
提供一个遍历我的 criteria
列表的方法,并根据具体类型执行一些逻辑。
我目前正在使用 instanceof
这样做:
for(Criteria c : criteria) {
if(c instanceof ContextualCriteria){
// logic
}
...
}
这是唯一/最好的方法吗?
最佳答案
逻辑是否合理地属于 Criteria
本身?如果是这样,将它放入 Criteria
接口(interface),并为每个实现 Criteria
接口(interface)的具体类适本地实现它。这显然是不错的多态方法。
不幸的是,在现实生活中 OO 并不总是那么简单 - 有时将每个类型的行为放在类型本身中没有意义,因此您可能需要使用 instanceof
代替。您可能可能有一个从“条件类”到表示要采取的操作的某个接口(interface)的映射,但这很容易最终变得更加困惑。
通过 visitor pattern 进行双重调度有时可以稍微改进一下 - 所以逻辑仍然可以在您的“调用”类中的单独方法中,但是每个 Criteria
都可以调用 back通过单个接口(interface)方法到正确的方法。就我个人而言,我倾向于发现这会增加耦合并很快变得丑陋,但其他人发誓。
关于java - 如何在不使用 instanceof 的情况下查找类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7453288/