instanceof vs equals用于标识Class的已定义字符串

时间:2014-04-23 23:44:24

标签: java

我可以在我使用instanceof工作的程序中测试类类型,或者获取标识类apparteency的字段。所以选择是在

之间
if(myObjec instanceof Something){
} 

if(myObjec.geClassType().equals("Something")){
}

效率方面最好的是什么?

geClassType()是我工作的程序对象中存在的方法(不是标准的java方法),并且是一个返回字符串的方法。创建对象时,名称将作为字段传递

修改 我在代码中的第二个示例中得到的字段并不是确切地标识类而是一个类别,并且也用于不同的例程,但我也可以将此用于此目的,因为我为每个类别使用特定对象。 所以我已将此报告为getClassType,以使我的问题更加明确。

4 个答案:

答案 0 :(得分:4)

instanceof更有效,实际上有效(因为geClassType()不存在)并且更具可读性。

如果instanceof是您想要的行为(正如其他答案所指出的那样,您勾勒出的两种方法之间的行为可能不同)我不确定为什么您甚至会考虑替代方案?

编辑:我应该重申,即使你的上下文中有一个方法可以做你所描述的方法,我仍然看不出这样做的理由。它可能会引入错误,如果它不能完全按照您期望的方式工作(例如在不同的包中使用类似命名的类),它可能会更慢,但更重要的是它是非标准的,因此使您的代码更不易读。

简而言之,instanceof是一个非常有用的关键字,能够以最小的麻烦完全按照您的要求,可靠且可读。为什么你不会使用它?!

答案 1 :(得分:2)

如果使用instanceof验证对象引用是否属于特定类而不是比较类的名称,则可能意味着有什么区别。

instanceof适用于来自类或被比较类的子类的对象引用。在接口的情况下,如果对象引用的类(或超类)实现此接口,则返回true

getClass().getName().equals("NameOfTheClass")(由您的getClassType方法屏蔽)将验证对象引用的类是否完全来自另一个类,因此子类不会传递此测试

使用哪一个?使用最适合您案例的那个:

  • 如果您希望/需要使用属于某个类或接口的对象引用,即使对象引用的类是子类或实现接口,也请使用instanceof。例如,在遍历Collection的元素时,验证某些对象是否实现了所需的接口。

  • 如果您需要确定对象引用的类是否完全特定类,请使用getClass().getName().equals("...")。例如,在类中实现equals方法时应该与仅属于此类的元素进行比较(不允许子类)。某些IDE在自动生成equals方法时执行此操作。

但是,比getClass().getName().equals("...")更好的选择是getClass().equals(TheClass.class)


就效率而言,如果您需要验证对象是否仅属于特定类,请使用getClass().equals(TheClass.class)而不是getClass().getName().equals("..."),因为会比较引用(与{{1一样快) }})。但是,如果您只有类名,请使用当前的方法。不要担心应用程序的性能,因为JIT将在几次执行代码后为您在运行时优化代码。不过,如果您认为此声明可能是性能瓶颈,请使用分析器证明它。

答案 2 :(得分:0)

这两者可能有所不同,也可能有所不同。

if(myObjec instanceof Something){ 
}

条件为true,如果myObjec的类在运行时是Something或任何来自Something的类,则直接或间接。

if(myObjec.geClassType().equals("Something")){
}

如果geClassTypeSomething中返回"Something"并且未在任何子类中覆盖的方法,那么这相当于使用{{ 1}}。但是如果有instanceof的任何子类覆盖Something以返回不同的字符串,那么geClassType将为该类的对象返回instanceof,而第二个将返回true {1}}。

如果两者真的相同,我不知道哪一个更有效率,如果答案从一个实施到另一个不同,我也不会感到惊讶。

P.S。我同意这样的评论,即做其中任何一个都可能是错误的。相反,您应该考虑如何在花括号内部排列逻辑以使其具有多态性;或者如果您尝试测试的某些属性对于false是正确的,对于其他类则为false,则添加多态Somethingboolean isGrungy()方法以明确您的内容我试图测试,而不是依赖于类名。

答案 3 :(得分:-1)

你可能意味着getClass

instanceof更好,因为

  • getClass使用类名作为String,它可能会拼错而且永远不会被发现(等式检查将返回false),
  • instanceOf使用该类本身
  • 在编译时检查instanceof的第二个参数,不仅是类名,还包括类层次结构(例如," test" isnanceof Integer将得到编译时错误)。