我可以在一个程序中测试类类型,在该程序中,我既要使用instanceof
,也要获取一个标识类外观的字段。所以选择是在之间
if(myObjec instanceof Something){
}
和
if(myObjec.geClassType().equals("Something")){
}
就效率而言,什么是最好的?
geClassType()
是我正在工作的程序对象中的一个方法(不是标准的java方法),也是一个返回带有类名称的字符串的方法。当创建对象时,名称作为字段传递
编辑我在代码的第二个示例中得到的字段并不能准确地识别类,而是一个类别,它也用于不同的例程,但我也可以将其用于此目的,因为我为每个类别使用了一个特定的对象。因此,我将此报告为getClassType
,以使我的问题更加清楚。
instanceof
更高效,实际工作(因为geClassType()
不存在),可读性更强。
如果instanceof
是你想要的行为(正如其他答案所指出的,你概述的两种方法之间的行为可能不同),我不确定你为什么会考虑另一种选择?
编辑:我应该重申,即使你在你的背景下有一种方法可以做到你所描述的,我仍然看不出有充分的理由这样做。如果它不能完全按照你期望的方式工作(比如在不同的包中使用类似名称的类),它可能会引入错误,速度可能会较慢,但更重要的是,它是非标准的,因此会使你的代码可读性大大降低。
简而言之,instanceof
是一个有用的关键字,它可以准确、可靠、易读地完成您想要的任务,而不必大惊小怪。你到底为什么不使用它
您的意思可能是,如果使用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("...")
,因为可以比较引用(这与instanceof
一样快)。但是,如果您只有类名,请使用当前的方法。不要担心应用程序的性能,因为JIT会在多次执行代码后在运行时为您优化代码。不过,如果您认为此语句可能是性能瓶颈,请使用探查器来证明它。
两者的工作方式可能不同,也可能不同。
if(myObjec instanceof Something){
}
如果myObjec
的类在运行时是Something
或直接或间接从Something
派生的任何类,则条件为true
。
if(myObjec.geClassType().equals("Something")){
}
如果geClassType
是Something
中返回"Something"
,的方法,并且它在任何子类中都没有被重写,那么这相当于使用instanceof
。但是,如果Something
的任何子类覆盖geClassType
以返回不同的字符串,则instanceof
将为该类的对象返回true
,而第二个子类将返回false
。
如果两者真的相等,我不知道哪一个会更有效,如果答案因实现而异,我也不会感到惊讶。
附言:我同意这样的评论:做其中任何一个都可能是错误的。相反,您应该考虑如何将逻辑排列在大括号内,使其具有多态性;或者,如果您要测试的某个属性对Something
为true,对其他类为false,那么添加一个多态boolean isGrungy()
或boolean hasGrunginess()
方法,以明确您要测试什么,而不是依赖类名。
您可能是指getClass
。
instanceof
更好,因为
- CCD_ 41使用类名作为CCD_
instanceOf
使用类本身instanceof
的第二个参数在编译时进行检查,不仅检查类名,还检查类层次结构(例如,"test"isnanceofInteger将在编译时出错)