整理Effective Java書中Item 8: Avoid finalizers and cleaners心得筆記

主旨

開門見山提到finalizers是不可預測行為、危險的並且也是不並要的。不當使用可能會導致不穩定的行為、糟糕的效能以及其他問題。在Java9已經把finalizers換成cleaners了,雖然cleaners比finalizers危險性較小,但還是一樣有無法預測、效能差等問題,很多開發者看完這段還是不清楚書中到底要說什麼。繼續研究下去。

劃重點

  1. 不要把Java裡面finalizers和cleaners當成C++裡面的解構子(destructors)。
  2. 當物件無法訪問時,finalizers和cleaners不能保證會被立刻執行。
  3. 如果將程式邏輯加在這裡,有可能在測試環境的JVM沒問題,但是移交給客戶跑在客戶的JVM環境就錯誤。
  4. System.gc()System.runFinalization()不能保證一定會執行。
  5. 在finalize寫了一段邏輯結果出錯了也沒被處理,導致這個物件就處於損壞狀態,可會造成不可預期其他問題。
  6. 效能差。
  7. 安全問題。

小結

說真的還得沒什麼機會使用finalizers和cleaners,如果有興趣想了解可以往JVM的運作原理下手。