我正在审核一些代码。在该代码中有一个事件监听器的构造函数,类似于以下代码:
A = LOAD 'test.csv' USING PigStorage(',');
B = GROUP A by $1;
C = FOREACH B {
AA = FILTER A by $0 == 'A';
BB= FILTER A by $0 == 'B';
GENERATE FLATTEN($0), AA,BB;};
dump C;
现在,我的问题是:为什么谁会编写此代码调用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
的一个实例,除了构造函数中的该位置之外,不会在代码中的任何位置使用。
答案 0 :(得分:5)
不,没有理由这样做。 getClass
方法是非虚拟的,没有副作用。因此,这种说法本身无法产生任何影响。此外,已经明确检查了已分配引用的null
,因此此调用不会引发NullPointerException
。
有些人喜欢将getClass
用作“快速”或“简洁”null-check,因为JIT对待此方法的方式。这是not longer true for modern VMs,并未正确公开您的意图。此外,getClass
还有strange side-effects for C2 compilation。我希望这是不完整重构的结果。也许你的版本历史揭示了这个陈述的起源。
答案 1 :(得分:0)
没有理由在那个地方调用那种方法。这是多余的,因为您只是调用并且没有接收任何输出,或者该方法不会影响对象的状态。
可以删除。