我看到使用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
?
给定一个场景:我知道要匹配的确切类,即String
,Integer
(这些是最终类),等等。
使用instanceOf
操作员的做法不好吗?
instanceof
和表现getClass() == ...
不同的原因是他们在做不同的事情。
instanceof
测试左侧对象引用(LHS)是右侧类型(RHS)的实例 还是某个子类型 。
getClass() == ...
测试类型是否相同。
因此,建议您忽略性能问题,并使用可为您提供所需答案的替代方法。
使用
instanceOf
操作员是不好的做法吗?
不必要。过度使用instanceOf
或getClass()
可能是
“设计异味”。如果您不小心,最终会遇到这样的设计:添加新的子类会导致大量的代码重做。在大多数情况下,首选方法是使用多态性。
但是,在某些情况下,这些不是“设计气味”。例如,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)中,而不是只让圆圈与圆圈匹配。瓷砖也有两种方法来添加/移除它们可以匹配的瓷砖。 所以假设我们在游戏中间有一个圆形瓷砖,我们有
问题内容: 在上面的示例中,和是。那么,我该如何区分和使用? 问题答案: