当前位置: 首页 > 面试题库 >

instanceof与getClass()

吕寒
2023-03-14
问题内容

我看到使用getClass()==运算符超过instanceOf运算符时性能有所提高。

Object  str = new Integer("2000");

long starttime = System.nanoTime();

if(str instanceof String) {
    System.out.println("its string");
} else {
    if (str instanceof Integer) {
        System.out.println("its integer");

    }
}

System.out.println((System.nanoTime()-starttime));

starttime = System.nanoTime();

if(str.getClass() == String.class) {
    System.out.println("its string in equals");
} else {
    if(str.getClass() == Integer.class) {
        System.out.println("its integer");
    }
}

System.out.println((System.nanoTime()-starttime));

有没有使用getClass()或使用的指南instanceOf

给定一个场景:我知道要匹配的确切类,即StringInteger(这些是最终类),等等。

使用instanceOf操作员的做法不好吗?


问题答案:

instanceof和表现getClass() == ...不同的原因是他们在做不同的事情。

  • instanceof测试左侧对象引用(LHS)是右侧类型(RHS)的实例 还是某个子类型

  • getClass() == ... 测试类型是否相同。

因此,建议您忽略性能问题,并使用可为您提供所需答案的替代方法。

使用instanceOf操作员是不好的做法吗?

不必要。过度使用instanceOfgetClass() 可能是
“设计异味”。如果您不小心,最终会遇到这样的设计:添加新的子类会导致大量的代码重做。在大多数情况下,首选方法是使用多态性。

但是,在某些情况下,这些不是“设计气味”。例如,equals(Object)您需要测试参数的实际类型,false如果不匹配则返回。最好使用来完成getClass()

应谨慎使用“最佳实践”,“不良实践”,“设计气味”,“反模式”等术语,并应予以怀疑。他们鼓励黑白思维。最好是根据上下文做出判断,而不是纯粹基于教条。例如某人说的是“最佳实践”。



 类似资料:
  • 问题内容: 整个泛型问题有点让我陷入困境,RTT更是如此。 规范?嗯,这是要点: 然后我会这样称呼它: 这样一来,我便可以在实际的帮助程序中灵活地分配查询返回类型。它进行一些转换和对象创建。我看到的是没有匹配项,我应该以其他方式这样做吗?还是整个想法不好? 真正的核心是我不了解class.isInstance和instanceOf运算符之间的区别?我应该使用后者吗? 问题答案: 这样一来,我便可以

  • 由于编译器使用类型擦除,因此运行时不跟踪类型参数,因此在运行时无法使用instanceOf运算符验证Box 和Box 之间的差异。 Box<Integer> integerBox = new Box<Integer>(); //Compiler Error: //Cannot perform instanceof check against //parameterized type Box<In

  • 问题内容: 使用以下内容之间是否存在偏好或行为差异: 和 ? 问题答案: 在大多数情况下,应使用运算符测试对象是否为数组。 通常,您需要先测试对象的类型,然后再向下转换为编译时已知的特定类型。例如,也许您编写了一些可以使用或的代码。您想使用以下方法保护自己的演员: 在JVM级别,操作员将转换为特定的“实例”字节代码,该代码在大多数JVM实现中都得到了优化。 在极少数情况下,您可能会使用反射遍历未知

  • 问题内容: 我正在尝试编写一个将通用列表转换为特定类型列表的函数。在下面找到代码 但是显示编译错误- 无法对类型参数T执行instanceof检查。请改用其擦除对象>,因为在运行时将删除更多的通用类型信息。 任何澄清或方法来获得预期的结果? 提前致谢。:) 问题答案: 您无法以这种方式这样做。幸运的是,您已经有一个参数,所以可以 如果属于类或子类,则将返回true 。 正如@ILMTitan指出的

  • 我在用C#制作的一个游戏中遇到了一个问题。这是一个简单的基于平铺的匹配游戏,我试图制作的一个电源问题出现了: 假设我们有基本的瓷砖类型,圆形、正方形和菱形,这些都是瓷砖的子类。我尝试将“matches”行为提取到一个抽象的Tile方法:canMatchWith(Tile t)中,而不是只让圆圈与圆圈匹配。瓷砖也有两种方法来添加/移除它们可以匹配的瓷砖。 所以假设我们在游戏中间有一个圆形瓷砖,我们有

  • 问题内容: 在上面的示例中,和是。那么,我该如何区分和使用? 问题答案: