SJ1*_*J19 21 java memory string int helper
很抱歉,如果这是一个新手问题,但我找不到答案.这样做更好:
int result = number/number2;
return result;
Run Code Online (Sandbox Code Playgroud)
要么:
return number/number2;
Run Code Online (Sandbox Code Playgroud)
我知道整数使用内存所以我猜它会略微降低性能?但另一方面它使事情变得更清楚,特别是当int/string是一个很长的计算时.
Fre*_*ula 22
实际上有一个从PMD继承的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;
}
Run Code Online (Sandbox Code Playgroud)
在某些情况下,我们需要一个与返回类型不同的变量.这会影响类型转换和推理,从而产生显着的语义差异.
Foo foo() vs. Foo foo()
{ {
Bar bar = expr;
return expr; return bar;
} }
Run Code Online (Sandbox Code Playgroud)
编译器通常足够聪明,可以适当地优化这种事情.请参阅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 -c a
Compiled from "a.java"
class a {
a();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()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
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6650 次 |
| 最近记录: |