Java If语句中的可执行语句
我想问的问题有一个解释代码。Sureley,下面代码之间的差异是可以忽略的,但它描述了这一点 哪一个在内存使用和性能方面最有效Java If语句中的可执行语句,java,Java,我想问的问题有一个解释代码。Sureley,下面代码之间的差异是可以忽略的,但它描述了这一点 哪一个在内存使用和性能方面最有效 if( MathUtil.CalculateSin(angle) > Angles.ACUTE){ // Something is done } 或 这取决于您是否要重复使用该变量 如果是,请使用第二种情况 如果没有,请使用第一种情况 如果不打算重复使用,则没有理由将该值存储在变量中 编辑: 根据你的评论,似乎你问这个问题主要是出于性能考虑
if( MathUtil.CalculateSin(angle) > Angles.ACUTE){
// Something is done
}
或
这取决于您是否要重复使用该变量
- 如果是,请使用第二种情况
- 如果没有,请使用第一种情况
不要期望这两种方法在内存使用方面有任何差异,JVM和JIT将尽可能地优化它,使这两种情况变得相同。引用确实占用内存。所以,如果您不打算在任何其他地方使用
角度,那么第二个选项就是您应该选择的。此外,它不会污染名称空间。这就是人们将Comparator
作为匿名类而不是创建新类的原因之一。如果它们不需要在其他地方使用。 扩展其他答案,还应该考虑代码的可读性。在本例中,MathUtil.CalculateSin(angle)
的含义非常明显。但是,如果您有一个更复杂的条件,最好预先计算该条件,给变量一个有意义的名称,然后在if
-语句中使用该变量
在您的情况下,它还取决于if
-语句的上下文。同样,MathUtil.CalculateSin(angle)>Angles.ACUTE也很容易一目了然。但是,
final boolean angleIsAcute = (MathUtil.CalculateSin(angle) > Angles.ACUTE);
if(angleIsAcute) { ... }
会更好地表达意思。当然,在这种情况下,这两种可能性是非常相似的,但我希望你能看到我的想法
不要担心存储额外变量会带来的开销。即使java编译器没有优化您的代码,任何值得一试的JVM都会优化字节码,性能开销可以忽略不计。即使在代码后面不需要变量时,我也经常使用第一种模式。其优点是便于调试
在调试器中单步执行代码时,可以检查和更改变量的值
如果在语句右侧的调用中发生异常,则有时会比将调用嵌入到If
或作为另一个调用的参数时更清楚发生了什么
如果您担心变量的内存使用,请不要担心。信任编译器优化掉它知道以后不会使用的变量。如果您声明变量final
,它将被积极优化。这取决于您是否要在其他地方使用angleSin
。在这种情况下,选项1。第一种方法更好,因为它将临时变量angleSin
的范围限制为If(…)
。也许这个问题应该在@bigdestroyer中,不,对不起。代码太短了。代码审查是为了审查工作代码,而不是询问最佳实践。这个问题可能会被关闭,因为它提供了示例代码。即使我们没有将“MathUtil.CalculateSin(angle)”分配给变量,结果是否会占用内存(与变量完全相同)?因为所有答案都一致认为内存使用不会有任何不同,使用一个变量进行调试就足够了。嗯said@Kevin在大多数IDE中,您也可以在单步执行语句时检查语句。在变量选项卡中直接查看变量,而不是选择语句并单击“执行语句”查看结果。我认为第一种方法更简单、更有用。@ChetanKinger当鼠标悬停在if
语句中嵌入的调用上时,你看到它的值了吗?我在Eclipse中没有注意到这一点,但我必须注意它。你的评论启发我补充说,如果值在它自己的语句中,你也可以更改它。@KevinCondon我很少发现自己调试应用程序,因为我编写了全面的单元测试。我不喜欢声明变量的想法,因为我懒得突出显示语句并检查(eclipse特性。快捷键为Ctrl+I)它的结果。:)。尽管如此,我并不反对你。如果您发现自己多次调试应用程序,那么变量可能会有所帮助。尽管如此,此更改只应暂时用于调试。另一种方法是使用实用程序方法创建实用程序类,例如isangelacute(双角度)
,以便在应用程序中重复使用此类比较。但是+1的可读性优势,其他答案没有涵盖。我也同意可读性胜于微优化(即使在这种情况下没有),但OP在评论中澄清,他对效率的目的很好奇。这仍然是一个很好的答案,因为我认为开发人员必须记住,微优化并不总是一个好主意。然而,我更喜欢@ChetanKinger提出的替代方法来考虑可重用性。我完全同意您的实施建议。我只是从零开始编写了这段代码,以便演示我的观点。不过我很感谢你的努力。如果我在我的示例中使用了布尔方法,那么就更难解释了。
final boolean angleIsAcute = (MathUtil.CalculateSin(angle) > Angles.ACUTE);
if(angleIsAcute) { ... }