当前位置: 首页 > 面试题库 >

如何不使用instanceof来查找类型?

黄跃
2023-03-14
问题内容

我班上有一个List接口类型。Criteria``Query

List<Criteria> criteria = new ArrayList<Criteria>();

我有的几个具体实现Criteria。我想提供Query一种遍历criteria列表的方法,并根据具体类型执行一些逻辑。

我目前正在这样做,instanceof就像这样:

for(Criteria c : criteria) {
    if(c instanceof ContextualCriteria){
        // logic
    }
    ...
}

这是唯一/最佳方法吗?


问题答案:

逻辑是否合理地属于Criteria自身?如果是这样,请将其放入Criteria接口中,并为实现该Criteria接口的每个具体类适当地实现它。显然,这是一种
不错的 多态方法。

不幸的是,在现实生活中,OO并非总是那么简单-有时将按类型的行为放在类型本身中是没有意义的,因此您可能需要使用OO instanceof。你可以
潜在地 具有“标准级”来代表行动采取一些界面中的地图,但是这样很容易最终被甚至混乱。

通过访问者模式进行两次调度 有时 可以改善一些情况-
因此逻辑仍然可以在“调用”类的单独方法中,但是每个方法都Criteria可以通过单个接口方法来 回调
正确的方法。就我个人而言,我倾向于发现这种耦合会增加耦合并使其变得丑陋,但其他人对此却发誓。



 类似资料:
  • 在kotlin类中,我将方法参数作为类类型T的对象(请参见此处的kotlin文档)。当我调用方法时,我将传递不同的类作为对象。在Java中,我们可以使用对象的来比较类是哪个类。 所以我想在运行时检查和比较它是哪个类? 如何在Kotlin中检查类?

  • instanceof 操作符用于检查一个对象是否属于某个特定的 class。同时,它还考虑了继承。 在许多情况下,可能都需要进行此类检查。例如,它可以被用来构建一个 多态性(polymorphic) 的函数,该函数根据参数的类型对参数进行不同的处理。 instanceof 操作符 语法: obj instanceof Class 如果 obj 隶属于 Class 类(或 Class 类的衍生类),

  • 问题内容: 我正在尝试将ScalaTest合并到我的Java项目中。用ScalaTests替换所有JUnit测试。一方面,我想检查Guice的Injector是否注入正确的类型。在Java中,我有这样的测试: 但是我在使用ScalaTest做同样的问题: 它抱怨说,价值是不是成员/ / 。我不能在Scala中使用这种方式吗? 问题答案: Scala不是Java。Scala只是没有运算符,而是有一个

  • 问题内容: 好的,所以我有一个index.php文件,它必须处理许多不同的文件类型。我如何猜测基于的文件类型。 如果我请求,则所有请求都通过index.php重定向,如下所示 我将如何使其正常工作? 我应该根据所请求文件的扩展名进行测试,还是可以获取文件类型? 问题答案: 如果您确定只使用图像,则可以查看 getimagesize() exif_imagetype() PHP函数,尝试返回图像的m

  • 问题内容: 如果我们采用以下代码: 相对于,更喜欢多态是什么意思,顺便说一句,为什么更好呢? 编辑: 我了解什么是多态性;我所缺少的是人们将如何使用它而不是。 问题答案: if … else …(或switch或Visitor)之间以及多态之间的主要区别是模块化。有所谓的开闭原理,这基本上意味着,当您向现有程序中添加新功能时,对现有代码所做的更改越少越好(因为每次更改都需要一些工作,并且可能会引入

  • 问题内容: 在我的网页中,有一个名为的。 我如何找到它? 问题答案: 此选择器应该可以工作,但是如果您用合适的标记替换它,效率会更高: 或者,由于我们知道所搜索的元素是: 但是,因为这也可以匹配诸如或的情况,所以注释中提供的@Tomalak版本 更好 : 如果您真的想确定它可以正确匹配,则还可以使用normalize-space函数清除类名周围的杂散空格字符(如@Terry所述): 请注意,在所有