繁体   English   中英

在哪里声明变量(Java)

[英]Where to declare a variable (Java)

我现在正在使用Java Swing制作GUI,并且正在进行一些代码重构。

我的问题是:就内存/效率而言,在何处声明变量类型是否重要? 码:

for (int i = 0; i < 7; i++) {
    JTextField textfield = new JTextField(5);
    // Do stuff with textfield

VS:

JTextField textfield;
for (int i = 0; i < 7; i++) {
    textfield = new JTextField(5);
    // Do stuff with textfield

最佳做法是仅在需要时才创建变量。 因此,如果您不需要循环外的变量,那么最好只在循环内声明和初始化(即您提到的前一种情况)

如果仅在循环内需要它,则在内部声明它。 循环完成后,文本字段将可用于垃圾回收。

这样,您可以尽快将对象提供给垃圾收集。

第一种方法更安全-如果在分配变量时存在一些更复杂的逻辑(例如,在一组条件或一个开关中),而您没有在分支之一中进行设置,则编译器会告诉您。 使用第二种方法时,这样的编程错误将导致先前迭代中的值留在变量中-甚至可能需要很长时间才能检测到。

尽管我同意所有答案,但我相信OP在内存使用/效率方面提出了要求。 老实说,我认为这实际上取决于您要在for循环中尝试进行的工作。 但这可以通过快速测试轻松确定:

Runtime runtime = Runtime.getRuntime();
long start = System.currentTimeMillis();
for (int i = 0; i < 7; i++) {
    String textfield1 = "test1";
}
long stop = System.currentTimeMillis();
long memory = runtime.totalMemory() - runtime.freeMemory();
System.out.println("Test 1 time: " + (start - stop) + " millisecond");
System.out.println("Test 1 memory used: " + memory + " bytes");

runtime = Runtime.getRuntime();
start = System.currentTimeMillis();
String textfield2;
for (int i = 0; i < 7; i++) {
    textfield2 = "test2";
}
stop = System.currentTimeMillis();
System.out.println("Test 2 time: " + (start - stop) + " millisecond");
System.out.println("Test 2 memory used: " + memory + " bytes");

输出:

Test 1 time: 0 millisecond
Test 1 memory used: 3963816 bytes
Test 2 time: 0 millisecond
Test 2 memory used: 3963816 bytes

结论:对于小型程序,这无关紧要。 如果循环很大,或者它是一个嵌套循环,那么在进行一些繁重的工作时可能会有所不同。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM