Tips
書中的源代碼地址:https://github.com/jbloch/effective-java-3e-source-code
注意,書中的有些代碼裏方法是基於Java 9 API中的,因此JDK 最好下載 JDK 9以上的版本。java
Java Native Interface(JNI)容許Java程序調用本地方法(native methods),這些方法是用本地編程語言(如C或C ++)編寫的方法。 從歷史上看,本地方法有三個主要用途。 它們提供對特定於平臺設備(如註冊表)的訪問。 它們提供對現有本地代碼庫的訪問,包括提供對遺留數據庫的數據訪問。 最後,本地方法用於以本地語言編寫應用程序的性能關鍵部分,以提升性能。git
如今已經再也不建議使用本地方法來提升性能。 在早期版本(Java 3以前)中,它一般是必需的,但從那時起JVM就變得更快了。 對於大多數任務,如今能夠在Java中得到可比較的性能。 例如,當在Java版本1.1中添加java.math時,BigInteger依賴於用C語言編寫的一個快速多精度算術庫。在Java 3中,BigInteger在Java中從新實現,並仔細調整到比原始本地實現運行得更快的程度。程序員
這個故事的一個可悲的結尾是,除了在Java 8中對大數進行更快的乘法運算以外,BigInteger此後幾乎沒有發生什麼變化。在此期間,對本地類庫的工做繼續快速進行,尤爲是GNU多精度算術類庫(GMP)。若是須要真正高性能多精度算法,Java程序員如今能夠經過本地方法使用GMP [Blum14]。github
使用本地方法具備嚴重的缺點。 因爲本地語言不安全(條目50),使用本地方法的應用程序再也不免受內存損壞錯誤的影響。 因爲本地語言比Java更依賴於平臺,所以使用本地方法的程序不太可移植。 它們也更難調試。 若是使用不當,本地方法可能會下降性能,由於垃圾收集器沒法自動甚至跟蹤本地內存使用狀況(條目 8),而且存在進入和退出本地代碼相關的成本。 最後,本地方法須要「粘合代碼」,難以閱讀,編寫還繁瑣。算法
總之,在使用本地方法以前要三思然後行。 不多須要使用它們來提升性能。 若是必須使用本地方法來訪問地城資源或本地類庫,請儘量少地使用本地代碼,並對其進行完全測試。 本地代碼中的單個錯誤可能會破壞整個應用程序。數據庫