Java 标识类的已定义字符串上的instanceof vs equals

Java 标识类的已定义字符串上的instanceof vs equals,java,Java,我可以在一个程序中测试类类型,在该程序中,我同时使用instanceof或获取一个标识类外观的字段。因此,选择是在两者之间 if(myObjec instanceof Something){ } 及 在效率方面,什么是最好的 geClassType()是我正在工作的程序对象中存在的一个方法(不是标准java方法),是一个返回带有类名的字符串的方法。创建对象时,名称作为字段传递 编辑 我在代码的第二个示例中得到的字段并没有准确地标识类,而是一个类别,并且还用于不同的例程,但是我也可以使用它,因

我可以在一个程序中测试类类型,在该程序中,我同时使用
instanceof
或获取一个标识类外观的字段。因此,选择是在两者之间

if(myObjec instanceof Something){
} 

在效率方面,什么是最好的

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

编辑 我在代码的第二个示例中得到的字段并没有准确地标识类,而是一个类别,并且还用于不同的例程,但是我也可以使用它,因为我为每个类别使用特定的对象。
因此,我将其报告为
getClassType
,以使我的问题更清楚。

的instanceof
更有效,实际上可以工作(因为
geClassType()
不存在),并且可读性更强

如果<代码>实例是你想要的行为(因为其他答案指出,在你勾勒的两种方法之间的行为可能不同),我不知道你为什么还要考虑备选方案?

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

简言之,
instanceof
是一个有用的关键字,它可以准确地、可靠地、易读地完成您想要的任务,并且不需要太大的麻烦。你到底为什么不使用它

你的意思可能是


instanceof
更好,因为

  • getClass
    将类名用作
    字符串,该字符串可能拼写错误,并且永远不会被发现(相等性检查将返回false)
  • instanceOf
    使用类本身
  • instanceof
    的第二个参数在编译时被检查,不仅检查类名,还检查类层次结构(例如,“test”isnanceof Integer将获得编译时错误)

如果使用
instanceof
验证对象引用是否属于特定类,与比较类的名称相比,您可能是指有什么区别

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

getClass().getName().equals(“NameOfClass”)
(被
getClassType
方法屏蔽)将验证对象引用的类是否完全来自另一个类,因此子类不会通过此测试

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

  • 如果希望/需要使用属于某个类或接口的对象引用,不管该对象引用的类是子类还是实现该接口,都可以使用
    instanceof
    。例如,在迭代
    集合的元素时,验证某些对象是否实现了所需的接口

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

不过,比
getClass().getName().equals(“…”)更好的选项是
getClass().equals(TheClass.class)



就效率而言,如果您需要验证对象是否只属于特定类,请使用
getClass().equals(TheClass.class)
而不是
getClass().getName().equals(“…”)
,因为这样会比较引用(与
实例的速度一样快)。但是如果您只有类名,请使用当前的方法。不要担心应用程序的性能,因为在多次执行代码之后,JIT将在运行时为您优化代码。不过,如果您认为这句话可能是性能瓶颈,请使用探查器来证明。

两者的工作方式可能不同,也可能不同

if(myObjec instanceof Something){ 
}
如果
myObjec
的类在运行时是
Something
或直接或间接派生自
Something
的任何类,则条件为
true

if(myObjec.geClassType().equals("Something")){
}
如果
geClassType
Something
中返回
“Something”
的方法,并且它在任何子类中都没有被重写,那么这相当于使用
instanceof
。但是如果
Something
的任何子类重写
geClassType
以返回不同的字符串,那么
instanceof
将为该类的对象返回
true
,而第二个将返回
false

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

另外,我同意这样的评论,即这样做可能是错误的。相反,你应该考虑如何安排卷曲括号内的逻辑以使其多态;或者,如果您试图测试的某个属性对
某物
是真的,而对其他类是假的,那么添加一个多态的
boolean isGrungy()
boolean hasGrunginess()
方法
if(myObjec.geClassType().equals("Something")){
}