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
的第二个参数在编译时被检查,不仅检查类名,还检查类层次结构(例如,“test”isnanceof Integer将获得编译时错误)instanceof
instanceof
验证对象引用是否属于特定类,与比较类的名称相比,您可能是指有什么区别
instanceof
适用于来自被比较类或类的子类的对象引用。对于接口,如果对象引用的类(或超类)实现此接口,则返回true
getClass().getName().equals(“NameOfClass”)
(被getClassType
方法屏蔽)将验证对象引用的类是否完全来自另一个类,因此子类不会通过此测试
用哪一个?使用更适合您的案例的:
- 如果希望/需要使用属于某个类或接口的对象引用,不管该对象引用的类是子类还是实现该接口,都可以使用
。例如,在迭代instanceof
集合的元素时,验证某些对象是否实现了所需的接口
- 如果需要确定对象引用的类是否准确地是特定类,请使用
)。例如,在类中实现getClass().getName().equals(“…”
方法时,该方法应与仅属于该类的元素进行比较(不允许使用子类)。一些IDE在自动生成equals
方法时执行此操作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")){
}