instanceof vs等于标识类的已定义字符串



我可以在一个程序中测试类类型,在该程序中,我既要使用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")){
}

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

如果两者真的相等,我不知道哪一个会更有效,如果答案因实现而异,我也不会感到惊讶。

附言:我同意这样的评论:做其中任何一个都可能是错误的。相反,您应该考虑如何将逻辑排列在大括号内,使其具有多态性;或者,如果您要测试的某个属性对Something为true,对其他类为false,那么添加一个多态boolean isGrungy()boolean hasGrunginess()方法,以明确您要测试什么,而不是依赖类名。

您可能是指getClass

instanceof更好,因为

  • CCD_ 41使用类名作为CCD_
  • instanceOf使用类本身
  • instanceof的第二个参数在编译时进行检查,不仅检查类名,还检查类层次结构(例如,"test"isnanceofInteger将在编译时出错)

最新更新