簡體   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