2014-09-21 68 views
-1

有時,當我們聲明和初始化變量,假設我們有一個int i =10;再經過一些代碼,這個變量將被修改這樣的代碼波紋管爲什麼在java中有變量

public class reset { 
    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     int i = 10; 
     int co = 1; 
     while (co < 10) { 
      i++; 
      System.out.println(i + "*" + co + "=" + i * co); 
      if (i == 99) { 
       i = 11; //line 11 
       co++; 
      } 
     } 
    } 
} 

然後在某個不重置選項點(這裏在第11行),我們需要重新初始化,然後變量,那豈不是很好,如果我們有任何的語言功能可以自動做這件事,而不是例如

reset:i 

我認爲這是對生產力非常有利,不是嗎是嗎?

+6

如果有什麼是初始化爲帶有副作用的表達式? – SLaks 2014-09-21 16:21:51

+0

您提出的語法與標籤類似,這會造成混淆。我只需爲初始值分配一個常量,並在重置時指定該常數。 – 2014-09-21 16:22:56

+0

SLaks:假設這種重置只有在分配常量值時纔可能使用 – 2014-09-21 16:25:22

回答

4

我們需要重新初始化,然後變量,那豈不是很好,如果我們有任何的語言特性做自動代替?

沒有

我認爲這是對生產力是非常有益的,不是嗎?

沒有

重置爲初始值的變量是在很多情況下,一個標誌,該變量的範圍大。所以乾淨的代碼幾乎不需要這樣的功能。

當然,每個功能都是以使語言複雜化爲代價的。

+2

你的答案不是很乾。 – SLaks 2014-09-21 16:25:15

+0

爲什麼不能? Jens – 2014-09-21 16:26:56

+0

+1提到「範圍」 – 2014-09-21 17:58:53

2

的初始化線

int i = 10; 

簡單地創建字節代碼指令值10分配給變量。該任務與任何其他任務相同。

要實現重置,需要爲每個變量保留一些額外的元數據,以說明什麼是特殊的初始值。該元數據當前未保存在符號表中,因爲沒有概念Java的'初始值'。額外的開銷將與復位命令的效用相抵消。

可能是一個好主意,但你可以通過聲明一個常量並重新分配常量來獲得相同的結果。

+0

的想法創建一個常量,並分配它,每次從我的腦海裏逃脫,但談論開銷,爲什麼不回到第一次分配字節碼指令,並再次做,不需要獲取更多數據?我是否瞭解你? – 2014-09-21 16:32:43

+1

你不想只是無聊地複製字節碼。你不想重複使用變量。如果你不得不查看初始值2頁的代碼,而不是僅僅看到賦值(希望得到一個可讀的常量標識符),那麼它不會很好讀。如果這可以用於某些分配(對於常數值)而不是用於具有副作用的分配,則會破壞對稱性。不是很有用,有很多原因,這不是一個好主意,對不起。 – 2014-09-21 16:40:24

+0

@initParam - 是的,如果Java語言有一個'默認'值的概念,那麼你可以發明一個'重置'語句,跟蹤符號表中的默認值,並生成合適的字節代碼來分配默認值重置語句的位置。但是,我越來越不相信這種效用。我想不出任何我的代碼的特定情況,其中「重置」將是代碼的任何特定簡化。 – AgilePro 2014-09-24 21:03:17

1

這段代碼如何?我可以理解,從首發的角度來看你的問題,但通常它需要一些更多的實踐看,爲什麼不要求一定的結構:

public class NoReset { 
    private static final int X_START = 11; 
    private static final int X_END = 99; 
    private static final int Y_START = 1; 
    private static final int Y_END = 9; 

    public static void main(String[] args) { 
     for (int y = Y_START; y <= Y_END; y++) { 
      for (int x = X_START; x <= X_END; x++) { 
       final int result = x * y; 
       System.out.printf("%d * %d = %d%n", x, y, result); 
      } 
     } 
    } 
} 

請注意,你不應該巢循環很多,但創建一個「隱藏的循環「至少是危險的,在你的代碼中很難跟蹤變量,如i

0

如果您想使用當前的Java語言,做你想做的事情,那麼只需提供在每個班級要進行「重置」之類的函數:

private void reset() { 
    var = xxx; 
    var2 = yyy; 
    ... 
} 
相關問題