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

时间:2009-05-29 23:21:22

标签: java reflection inheritance evaluation

我有一个基类Statement,其他几个类继承,名为IfStatementWhereStatement等...在{中执行测试的最佳方法是什么? {1}}语句用于确定实例派生自哪种if类?

6 个答案:

答案 0 :(得分:74)

if(object instanceof WhereStatement) {
   WhereStatement where = (WhereStatement) object;
   doSomething(where);
}

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

答案 1 :(得分:59)

if (obj.getClass().isInstance(Statement.class)) {
   doStuffWithStatements((Statement) obj));
}

这种技术的好处(与“instanceof”关键字相对)是你可以将测试类作为对象传递。但是,是的,除此之外,它与“instanceof”相同。

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

答案 2 :(得分:6)

你的问题的答案是instanceof。

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

答案 3 :(得分:2)

来自class的isAssignableFrom(java.lang.Class)就是你的答案。 http://download.oracle.com/javase/6/docs/api/java/lang/Class.html#isAssignableFrom(java.lang.Class

答案 4 :(得分:1)

试试这个:

if (Statement.class.isInstance(obj)) {
    doStuffWithStatements((Statement) obj));
}

因为Class.isInstance()方法将对象实例作为参数。

答案 5 :(得分:0)

这是以面向对象的方式做事的方式,它是对旧代码/数据二分法的回归。现在这不一定是坏事(如果你知道你在做什么),但它应该留给像C这样的非面向对象的语言。

通过适当的设计,您不需要那种行为。而不是构造:

if (obj.getClass().isInstance(Statement.class)) {
    doStuffWithStatements((Statement) obj));
}

(向'benjismith道歉'窃取'他的代码),你应该真正让对象本身对自己的活动负责:

obj.doStuff();

然后,每个不同的obj类都有自己的doStuff定义。这是正确的做法。