这里是Eclipse为我生成的hashCode()
方法:
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + (int) (id ^ (id >>> 32));
return result;
}
当我在这上面运行findbugs时,它会抱怨最后一行:
方法... hashCode()在返回结果之前将结果存储在本地[Scariest(2), 正常信心]
谁在这? Findbugs还是Eclipse?这个狡猾吗?
我不能为我的生活看到为什么这对于苦艾酒来说是令人沮丧的。代码非常清楚;在返回之前将其存储在本地并不会使其难以阅读或难以维护;除非编译器编写得非常糟糕,否则它不会对性能产生任何影响。
然而,这被归类为最可怕!
我错过了什么吗?
(显然,代码可以在某些方面进行简化,并且它就是这样出现的,因为就Eclipse而言,可能已经进入哈希函数的其他字段但它具体是存储价值然后立即归还我在这里询问的问题,因为这就是findbugs所抱怨的。)
答案 0 :(得分:1)
谁在这? Findbugs还是Eclipse?这个狡猾吗?
通宵。代码风格主要取决于个人品味。在整个项目甚至整个世界中使用统一的代码风格是有用的,但是只要没有官方指南或整个社区普遍采用的规则,就没有更好或更差的风格。
有时一些规则会带来实际好处。在某些情况下,Eclipse的样式更具可读性(如果您有多个字段)。另一方面,正如@RomanC所提到的,firebug的规则具有在不必要的情况下拟合不使用变量的合同的优势。
有时,代码风格软件中的某些检查规则过于繁琐,但通常可以将其关闭或降低其重要性级别。我正在使用的IDE通常会将代码过时警告放在它自己生成的代码上。
注意:代码样式检查工具是可配置的。您可以仅启用那些可以降低为您,您的团队或组织维护代码的成本的规则。
答案 1 :(得分:0)
代码应该简化,因为它正在执行firebug通知的不必要的事情。此检查有效。
@Override
public int hashCode() {
return 31 + (int) (id ^ (id >>> 32));
}
答案 2 :(得分:0)
Eclipse代码并不是那么糟糕,但它不必要地笨拙。在这些微不足道的情况下,通常最好手工编写。您的代码基本上与此相同:
@Override public int hashCode() {
return Long.hashCode(id);
}
答案 3 :(得分:0)
它不是关于简化,而是关于你忘记某些事情的可能性。如果您存储结果,那很可能是因为您想要对其进行操作。如果没有,您只需将其退回。
FindBugs警告你,你很可能打算对存储的值做些什么,但可能已经忘了。
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + (int) (id ^ (id >>> 32));
// I meant to do something more here with result, but forgot...
return result;
}