Java程式設計思想第四版勘誤

王明輝發表於2017-10-09

  坊間傳說這本書翻譯得很爛,我倒覺得還好。雖然看原文更準確,但是如果在具備一定程式設計思維和基礎、能夠看出來疑問的情況下,還是看中文更快一些,而且這本書本身也不適合初學者看。當然,錯誤和不通順還是有的,而且官方和網上居然沒有一份公開的勘誤表,至少我沒有搜到,搜尋“Java程式設計思想第四版勘誤”時出現的都是CSDN上的一篇久遠的帖子。也許發現問題的人已經懂了,不在意那些錯誤。

在此記錄我發現的問題以及翻譯得不夠好的地方,如果有人能夠看到此文,且發現各種問題,歡迎補充。開源的工具就應當一切周邊都開源。

1.P49,第一行:

  錯誤:1.39e-43f

  更正:1.39e-43f,即:作為自然對數的基數使用,那麼在Java中看到像1.39e-43f這樣的表示式時,請轉換您的思維,它真正的含義是 1.39×10-43

2.P66,4.3.2 第二段,即從“初始化”開始的那段,第二行:

  錯誤:“若獲得的結果是false”

  說明:說的是for迴圈的執行條件,原文並沒有提到true或false。原文:This loop performs initialization before the first iteration. Then it performs conditional testing and, at the end of each iteration, some form of “stepping.” 

  更正:改為true或把此句刪除。

 3.P69,第二段,最後一句:

  錯誤:也許應該使用模擬器來做評價,它是一種可以度量程式碼效能的工具。

  說明:還仔細想了一下什麼是“模擬器”,看了下原文才知道是斜體的Profiler,指的是專有名詞。Profiler確實是一種可以度量程式碼效能的工具,此書錯在不應該翻譯專有名詞,就像不應該把Windows翻譯成視窗一樣。此處可以看出來譯者確實不懂技術。網上搜了一下譯者“陳昊鵬”,除了與這本書同時出現以外,就是“有多少與陳昊鵬同名的人”,沒有其它有價值的資訊,也就是說譯者並非一個IT界的人士,至少他沒有部落格和其它方面的知名度。

  更正:直接使用Profiler。

4.p96 第一段和第二段

  錯誤:

  共有5處錯誤,如下紅字

  Bowl 類使你得以看到類的建立, 而 Table 類和 Cupboard 類在它們的類定義中加入了Bowl型別的靜態成員。 注意, 在靜態資料成員定義之前,Cupboard 類先定義了一個 Bowl 型別的非靜態成員 b3。由輸出可見,靜態初始化只有在必要時刻才會進行。如果不建立 Table物件,也不引用Table.b1或 Table.b2, 那麼靜態的 Bowl b1和 b2 永遠都不會被建立。 只有在第一個 Table物件被建立(或者第一次訪問靜態資料)的時候,它們才會被初始化。此後,靜態物件不會再次被初始化。

  

  說明:網上有一版勘誤的文件說第三版就是錯的,這倒也不對。因為第三版中前面的變數定義時就定義為b1、b2、b3,此處屬於第四版的前面修改成一個有意義的名稱之後,後面的說明文字中沒有隨之修改】
  

  更正:b1、b2、b3修改為bowl1、bowl2、bowl3。

 

 5.P105,練習19上面那句話

錯誤:你應該總是隻在過載方法的一個版本上使用可變引數列表,或者壓根就不用它。

說明:這句沒有錯,也能看懂,只是不通順。另外,此書的翻譯大量使用了“壓根”這個詞,不算錯,但它太地方化和口語化,不是書面語。比較合適的詞是“根本”。

原文:You should generally only use a variable argument list on one version of an overloaded method. Or consider not doing it at all.

更正:去掉“是”,或者這樣改一下“一般來講,你應該只在一個過載版本上使用可變引數列表,或者根本不用它”。

 6.P126,第一段

錯誤:而且當編譯器需要一個String而你卻只有一個物件時

原文:and it’s called in special situations when the compiler wants a String but it has an object。

說明:這句翻譯得不太容易理解,“我”有一個物件和編譯器有什麼關係?可以看到,原文說的是“but it has an object”,是“它”有一個物件。也就是說,編譯器發現本來應當是個字串的變數,實際上是個物件,那麼就會預設呼叫物件的toString()把它轉化為String。

更正:而且當編譯器需要一個String而它只有物件(類例項)時。

 7.P127,中文第一段

錯誤:如果沒有在定義處初始化,那麼除非發生了不可避免的執行期異常,否則將不能保證資訊在傳送給物件引用之前已經被初始化。

說明:這句話看了好幾遍,沒看懂。看原文,如下:

原文:When you don’t initialize at the point of definition, there’s still no guarantee that you’ll perform any initialization before you send a message to an object reference—except for the inevitable run-time exception.

更正:當你沒有在定義時初始化,那麼不能保證在傳送訊息給物件之前被進行任何初始化,但是可以保證的是,你會得到一個執行時異常。

這裡譯者給直譯了,此處真的是需要了解才能譯。

 8.P163,程式碼後的第一段,以Glyph.draw()開頭。

 Glyph.draw( ) is designed to be overridden, which happens in RoundGlyph. But the Glyph constructor calls this method, and the call ends up in RoundGlyph.draw( ), which would seem to be the intent. But if you look at the output, you can see that when Glyph’s constructor calls draw( ), the value of radius isn’t even the default initial value 1. It’s 0.
This would probably result in either a dot or nothing at all being drawn on the screen, and you’d be left staring, trying to figure out why the program won’t work.

 

 Glyph.draw( )的設計用意是被子類RoundGlyph覆蓋。但是,Glyph構造器卻呼叫了這個方法【指的是Glyph.draw( )】,並且,這個呼叫是在RoundGlyph.draw( )之後結束的,這似乎是我們的意圖。但是,你看一下輸出,你可以看到當Glyph的構造器呼叫draw()以後,radius不是預設的1,而是0。這個結果在螢幕上可能只是一個點或什麼都沒有,然後你瞪大了眼睛【感到非常詫異,表震驚,而不是譯文中所說的表示毫無辦法的“乾瞪眼”】,【迷茫地去】嘗試找到為什麼程式不工作。

 9.P172,“但是”段。

錯誤:來實現某種類似多重繼變種的特性

更正:來實現某種類似變種的“多重繼承”的特性

10.P176,下數第一段。

錯誤:但是,如果Processor是一個介面,那麼這些限制就會變得輕鬆,使得你可以複用結構該介面的Apply.process()。

說明:不通,看不懂。

原文:If Processor is an interface, however, the constraints are loosened enough that you can reuse an Apply.process( ) that takes that interface.

更正:然而,如果Processor是個介面,這使限制就會降低,你就可以複用使用了這個介面的Apply.process()。

11.P193,下數第一段

翻譯偏差:這是因為內部類物件會暗暗地連線到建立它的外部類物件上

原文:This is because the object of the inner class is quietly connected to the object of the outer class that it was made from.

更正:這是因為內部類物件會隱式連線到建立它的外部類物件上

說明:“暗暗地”這個詞不能算錯,相對比較口語和不專業。前面某處還有一個,不找了。

12.P208,下數第二段,最後一句

錯誤:foreach語法用來連續獲聯List中的Event

更正:foreach語法用來連續獲取List中的Event

 

13.P217,第一段

錯誤:不受檢查的異常

更正:未檢查或不翻譯,直接用unchecked

 14.p219,11.2第5段

錯誤:你所需的只是在建立出修改它

更正:你所需的只是在建立處修改它

相關文章