我正在审查一些代码。该代码内部有一个事件监听器的构造函数,类似于以下代码:
public class MyClass implements ActionListener {
SomeOtherClass m_oc;
public MyClass(SomeOtherClass oc) {
if (null == oc) {
throw new IllegalArgumentException("oc cannot be null");
}
m_oc = oc;
m_oc.getClass();
}
@Override
public void actionPerformed(ActionEvent e) {
do_stuff();
}
private void do_stuff() {
/* some more code here, but this code never uses m_oc */
}
}
现在,我的问题是:为什么编写这段代码的人会调用 m_oc.getClass()
?
该对象 (m_oc
) 是 SomeOtherClass
的实例,除了构造函数中的该位置之外,代码中的任何位置都不会使用该对象。
最佳答案
不,没有理由这样做。 getClass
方法是非虚拟的,没有副作用。因此,该声明本身不可能产生任何效果。此外,已经对指定引用的 null
进行了显式检查,因此此调用不会引发 NullPointerException
。
有些人喜欢使用 getClass
作为“快速”或“简洁”null-check因为 JIT 处理此方法的方式。这是not longer true for modern VMs并且没有适本地暴露你的意图。另外,getClass
有 strange side-effects for C2 compilation 。我希望这是不完整重构的结果。也许您的版本历史记录揭示了此声明的起源。
关于java - 是否有理由在忽略返回值的情况下调用 obj.getClass() ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33297002/