2013-02-13 99 views
2

我正在閱讀一本關於Java的書,並且我們正在從一個頻道讀入ByteBuffer。我發現作者是構建while循環奇道:爲什麼有人會像這樣構造一個while循環?

 

    try (FileChannel inCh = (FileChannel) Files.newByteChannel(file)) { 
      ByteBuffer lengthBuf = ByteBuffer.allocate(8); 
      int strLength = 0; 

      ByteBuffer[] buffers = { null, ByteBuffer.allocate(8) }; 

      while(true) { 
       if(inCh.read(lengthBuf) == -1) 
        break; 
       lengthBuf.flip(); 

       strLength = (int)lengthBuf.getDouble(); 

       buffers[0] = ByteBuffer.allocate(2*strLength); 

       if(inCh.read(buffers) == -1) { 
        System.err.println("EOF found reading ht eprime string."); 
        break; 
       } 

       System.out.printf("String length: %3s String: %-12s Binary Value: %3d%n", strLength, 
            ((ByteBuffer) (buffers[0].flip())).asCharBuffer().toString(), 
            ((ByteBuffer)buffers[1].flip()).getLong()); 

       lengthBuf.clear(); 
       buffers[1].clear(); 
      } 
      System.out.println("\nEOF reached."); 
     } catch (IOException e) { 

我想它是這樣的:

while(inCh.read(lengthBuf) != -1) { 

,它的工作原理相同。作者是否會像他那樣寫出實用或代碼清晰的原因?

+0

這可能只是他們的個人喜好。如果您可以證明您的更改以同樣的方式運行,那麼如果您願意,也可以使用該更改。 – Bernard 2013-02-13 01:59:29

+0

不是我能看到的。 – 2013-02-13 02:00:25

回答

9

很明顯,你的循環版本在語義上是相同的。但是,這不是唯一需要考慮的事情。

請注意,在while循環的下面還有第二個條件,即跳出循環。我懷疑這是什麼促使作者使用while (true)

通過將其寫爲while (true)您提醒讀者注意,while內必須有一個或多個休息時間。讀者將不得不在循環中尋找休息時間,並希望能夠找到它們。

隨便讀者可能會掃描代碼的頂部,並假定while條件是循環終止的唯一途徑。

另一點需要考慮的是對稱性或平衡性。正如原作者所寫,循環終止都是相同的形式。即從循環內部休息。你的版本感覺不對稱。 while測試中的一個終止點,以及循環內另一個不同性質的終止點。

+2

評論不會殺死這個人! :) – 2013-02-13 02:03:06

2

作者有兩個退出點,其中一個在退出循環之前打印出錯誤。在這種情況下,讓代碼稍微冗長些。當然,它可以用許多不同的方式編寫。

相關問題