最近接了一個 Java 家教,目前在上 OO 概念的部份。因為本來就不是靠唸書學會 OO 的(而且也沒學得多好),加上閒來無事,所以拿起塵封已久的《Thinking in Java》中文版(2002 初版)來看一下有沒有啥遺漏的。
等等… 「(p.252) 利用 imports 來改變行為」?這是什麼鬼?書上是這樣寫的:
Java 並不具備 C 的「條件編譯(conditional compilation)」功能。此功能讓你得以切換開關,令程式產生不同行為,無須更動程式碼。Java 拿掉這個功能的原因,可能是因為此功能在 C 語言中多半被用來解決跨平台問題,也就是根據不同的平台編譯程式碼中的不同部份。由於 Java 本身的設計可自動跨越不同平台,所以應該不需要此功能。
不過條件編譯仍具有其他實用價值。除錯便是常用的用途之一:在開發過程開啟除錯功能,在出貨產品中關閉除錯功能。Allen Holub(www.holub.com)提出了以 packages 來模擬條件編譯的想法。根據這一想法,他在 Java 裡頭產生原本在 C 語言中極為有用的 assertion 機制。
基本上就是寫兩個叫做 Assert
的 class、擺在不同 package 下,要出貨的時候把 Assert
的 import 改成空殼 Assert
的路徑。
真的是時代的眼淚阿… [遠目]
其實中文版出版的同一年,Java 1.4 也出了,其中一個重大的改進就是導入 assert
。
這裡還有個不可靠的印象,就是當年有些人認為:「 assert
導入的太晚,現在用(誕生於 1997 年,正逐漸統治世界 XD) JUnit 就好了」
時至今日,JUnit 勉強算是有用一點,assert
則是從來沒用過,只有在追 GXT 的 source code 有看到過。至於「利用 imports 來改變行為」這事… 連我這種不碰 Spring 的咖小都知道應該要套個 DI 什麼的,而不是去動 import 這種鬼想法…
當然,現在回頭用吐槽的姿態看二十年前的概念實在沒什麼太大的意義,那時本來就還在盤古開天,連 design pattern 都還是浪頭上的顯學,殺個豬公也不是什麼太奇怪的事情,就只能說是時代的眼淚。
BTW… Allen Holub 的網站還在… 不知道當事人還記不記得這段黑歷史… wwwww