在哪里声明变量(Java)

时间:2015-10-23 18:41:37

标签: java swing jtextfield

我正在使用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

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

如果你只需要在循环内部,请在里面声明它。 循环结束后,文本字段将可用于垃圾收集。

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

虽然我同意所有的答案,但我相信OP在内存使用/效率方面提出了要求。老实说,我认为这实际上取决于你在循环中尝试做什么样的工作。但这很容易通过快速测试来确定:

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

结论:对于小型程序而言并不重要。如果循环很大,或者它是一个嵌套循环,那么如果你做了一些沉重的事情,它可能会有所不同。