Java是否具有"是一种类"的测试方法

Hea*_*ser 28 java reflection evaluation inheritance

我有一个基类,Statement,这是其它几类从,继承命名IfStatement,WhereStatement等...什么是在执行测试的最佳方式if声明,以确定哪种类型的Statement一个实例从派生类?

Dav*_*Ray 76

if(object instanceof WhereStatement) {
   WhereStatement where = (WhereStatement) object;
   doSomething(where);
}
Run Code Online (Sandbox Code Playgroud)

请注意,这样的代码通常意味着您的基类缺少多态方法.ie doSomething()应该是一个Statement被子类覆盖的方法,可能是抽象的方法.

  • 虽然我会补充说`instanceof`有很多有效的用途 - 但它并不总是一种设计气味.例如,如果`doSomething()`只适用于where子句,那么这种模式可能比人工制作`doSomething()`是Statement类的一部分(它在逻辑上不合适). (5认同)

ben*_*ith 62

if (obj.getClass().isInstance(Statement.class)) {
   doStuffWithStatements((Statement) obj));
}
Run Code Online (Sandbox Code Playgroud)

这种技术的优点(与"instanceof"关键字相对)是你可以将测试类作为对象传递.但是,是的,除此之外,它与"instanceof"相同.

注意:我故意避免编辑类型实例检查是否正确.是的,在大多数情况下,最好使用多态.但这不是OP所要求的,我只是在回答他的问题.

  • +1不是"编辑关于类型实例检查是否正确的事情" (10认同)
  • instanceof并不像goto那样邪恶.有一个原因是它被添加到语言中以及为什么它没有被弃用. (5认同)
  • 为什么不使用更简单的检查实例? (3认同)

Igo*_*kon 6

你的问题的答案是instanceof.

但是,请记住,如果您的代码需要instanceof,则表明您的设计出现问题.在某些情况下,instanceof是合理的,但它们是相当例外的.通常,如果您的子类需要表现不同,则必须使用多态而不是if()s.