返回语句之前的局部变量,是否重要?

很抱歉,如果这是一个新手问题,但我找不到答案。 这样做更好:

int result = number/number2; return result; 

要么:

 return number/number2; 

我知道整数使用内存所以我猜它会略微降低性能? 但另一方面它使东西更清晰,特别是当int / string是一个长计算时。

实际上有一个从PMDinheritance的SonarQube规则称为Unnecessary Local Before Return ,它讨论了这一点。 它说:

避免不必要地创建局部变量。

此规则后来被 SSLR规则替换 。 不应声明变量,然后立即返回或抛出 ,保持相同的位置:

声明变量只是为了立即返回或抛出它是一种不好的做法 。 一些开发人员认为这种做法提高了代码的可读性,因为它使他们能够明确地命名返回的内容。 但是,此变量是一个内部实现细节,不会向方法的调用者公开。 方法名称应足以让调用者准确知道将返回的内容

我完全赞同。

IntelliJ(或至少Android Studio)也有针对这种情况的警告:

变量仅用于以下返回,并且可以内联

此检查报告仅在下一次返回时使用的局部变量或其他变量的精确副本。 在这两种情况下,最好内联这样的变量。


在这种情况下,我认为表演根本不值得担心。 话虽如此,正如@Clashsoft在他的评论中所提到的,JIT最有可能内联变量,你最终会得到相同的结果。

选择认为更具可读性的版本。

存在命名变量提高可读性的合法情况。 例如

 public String encrypt(String plainString) { byte[] plainBytes = plainString.getBytes(StandardCharsets.UTF_8); byte[] hashPlainBytes = enhash( plainBytes, 4 ); byte[] encryptedBytes = doAes128(Cipher.ENCRYPT_MODE , hashPlainBytes ); String encryptedBase64 = Base64.getEncoder().withoutPadding().encodeToString(encryptedBytes); return encryptedBase64; } public String decrypt(String encryptedBase64) { byte[] encryptedBytes = Base64.getDecoder().decode(encryptedBase64); byte[] hashPlainBytes = doAes128(Cipher.DECRYPT_MODE , encryptedBytes ); byte[] plainBytes = dehash( hashPlainBytes, 4 ); String plainString = new String(plainBytes, StandardCharsets.UTF_8); return plainString; } 

在某些情况下,我们需要一个与返回类型不同的变量。 这会影响类型转换和推理,从而产生显着的语义差异。

 Foo foo() vs. Foo foo() { { Bar bar = expr; return expr; return bar; } } 

编译器通常足够聪明,可以适当地优化这类事情。 请参阅Wikipedia上的数据流优化 。

在这种情况下,即使您没有自己指定结果,也可能需要分配一个临时变量来存储结果。

编辑:Clashsoft对字节码编译器是正确的:

 $ cat a.java class a { public static int a(int x, int y) { return x / y; } public static int b(int x, int y) { int r = x/y; return r; } public static int c(int x, int y) { final int r = x/y; return r; } } $ javap -ca Compiled from "a.java" class a { a(); Code: 0: aload_0 1: invokespecial #1 // Method java/lang/Object."":()V 4: return public static int a(int, int); Code: 0: iload_0 1: iload_1 2: idiv 3: ireturn public static int b(int, int); Code: 0: iload_0 1: iload_1 2: idiv 3: istore_2 4: iload_2 5: ireturn public static int c(int, int); Code: 0: iload_0 1: iload_1 2: idiv 3: istore_2 4: iload_2 5: ireturn }