Effective Java Item8 避免使用finalizers和cleaners
整理Effective Java書中Item 8: Avoid finalizers and cleaners心得筆記
主旨
開門見山提到finalizers是不可預測行為、危險的並且也是不並要的。不當使用可能會導致不穩定的行為、糟糕的效能以及其他問題。在Java9已經把finalizers換成cleaners了,雖然cleaners比finalizers危險性較小,但還是一樣有無法預測、效能差等問題,很多開發者看完這段還是不清楚書中到底要說什麼。繼續研究下去。
劃重點
- 不要把Java裡面finalizers和cleaners當成C++裡面的解構子(destructors)。
- 當物件無法訪問時,finalizers和cleaners不能保證會被立刻執行。
- 如果將程式邏輯加在這裡,有可能在測試環境的JVM沒問題,但是移交給客戶跑在客戶的JVM環境就錯誤。
System.gc()
和System.runFinalization()
不能保證一定會執行。- 在finalize寫了一段邏輯結果出錯了也沒被處理,導致這個物件就處於損壞狀態,可會造成不可預期其他問題。
- 效能差。
- 安全問題。
小結
說真的還得沒什麼機會使用finalizers和cleaners,如果有興趣想了解可以往JVM的運作原理下手。
Read other posts