以下两个片段之间是否有任何性能或内存差异?我尝试使用visualvm对它们进行分析(这甚至是适合工作的正确工具吗?)但是没有注意到差异,可能是由于代码没有真正做任何事情。
编译器是否将两个片段优化为相同的字节码?出于风格原因,是否优先于另一种?
boolean valid = loadConfig();
if (valid) {
// OK
} else {
// Problem
}
与
if (loadConfig()) {
// OK
} else {
// Problem
}
答案 0 :(得分:2)
这里真正的答案是:javap会告诉你相应的字节码是怎样的,这甚至都不重要!
如果那段代码像“一次”一样执行;那么这两个选项之间的差异将在纳秒范围内(如果有的话)。
如果这段代码执行得像“数以万计”(通常足以“重要”);那么JIT就会启动。而JIT会将该字节码优化为机器码;非常依赖于JIT在运行时收集的大量信息。
长话短说:你花时间在细节上如此微妙,以至于在现实中并不重要。
实际情况中最重要的是:源代码的质量。从这个意义上说:选择“读取”最佳的选项;鉴于你的背景。
鉴于评论:我认为最终,这(几乎)是一个纯粹的风格问题。使用第一种方式可能更容易跟踪信息(假设变量不是布尔值,但更复杂)。从这个意义上说:没有“天生”更好的版本。当然:选项2少了一行;少用一个变量;通常:当一个选项与另一个选项一样可读时;其中一个更短......然后我更喜欢较短的版本。
答案 1 :(得分:2)
如果您只打算使用该变量一次,那么编译器/优化器将解析显式声明。
另一件事是代码质量。 sonarqube中有一个非常类似的规则也描述了这个案例:
不应声明局部变量,然后立即返回或抛出
声明变量只是为了立即返回或抛出它是一种不好的做法。 一些开发人员认为这种做法提高了代码的可读性,因为它使他们能够明确地命名返回的内容。但是,此变量是一个内部实现细节,不会向方法的调用者公开。方法名称应足以让调用者准确知道将返回的内容。