执行者使用哪种方法?
等于:
public boolean hasSellByDate(Object item) {
if ("Pear".equals(item.getClass().getSimpleName())) {
return true;
}
return false;
}
instanceof:
public boolean hasSellByDate(Object item) {
if (item instanceof food.Pear) {
return true;
}
return false;
}
这两种方法有什么区别,每种情况都有哪些缺点?
答案 0 :(得分:3)
第二个要好得多,因为第一个可以通过重构破坏,并且类型系统不会让您知道。
您还应该知道,第一个方法不适用于Pear
的子类。更糟糕的是,如果在不同的命名空间中有多个名为"Pear"
的类,可能会感到困惑。
关于性能,您将需要进行基准测试,但是我希望第二个也会更快,因为instanceof
是JVM(https://en.wikipedia.org/wiki/Java_bytecode_instruction_listings)上的单个操作码。
答案 1 :(得分:1)
我想将另外两个片段添加到您的列表中。因此,四个选项如下所示。
请注意,这四个选项在功能上都是不同的!
#1
public boolean hasSellByDate(Object item) {
if ("Pear".equals(item.getClass().getSimpleName())) {
return true;
}
return false;
}
#2
public boolean hasSellByDate(Object item) {
if (item instanceof food.Pear) {
return true;
}
return false;
}
#3
public boolean hasSellByDate(Object item) {
if ("food.Pear".equals(item.getClass().getName())) {
return true;
}
return false;
}
#4
public boolean hasSellByDate(Object item) {
if (item.class == food.Pear) {
return true;
}
return false;
}
Performancewise(至少在OpenJDK HotSpot JVM中):
#4
是最快的#2
和#3
接近,#2
可能在JIT编译之后最快。#1
可能是真正的性能瓶颈,尤其是在多线程环境中 Class.getSimpleName()
可能由于全局关键部分和字符串操作而变得缓慢。我已经看到它曾经是一个真正的性能瓶颈。该方法用于格式化日志消息。
从风格上讲,我会根据功能需求推荐#2
和#4
。
再强调一次,这四个选项在功能上都不同!