final、finally、finalize的理解

遛狗的程式設計師發表於2018-07-26

首先補充聽課心得(二)內容:預設情況在Android Studio中使用try-with-resources會提示Try-with-resources requires API level 19的警告⚠️ ,你需要自己再build.gradle檔案中設定指定JDK版本:

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}
複製程式碼

問題:

  • final、finally、finalize有什麼區別?

這是一道經典的基礎面試題,這裡不作分析,不瞭解的自己Google哦(它們除了字母類似,各自之間沒啥關係,有點類似Java和JavaScript有啥關係了)

補充其他知識點:
  1. final也許會有效能的好處,比如利用final可能(注意是可能)對效能有好處。比如:可能有助於將方法進行內聯,可以改善編譯器進行條件編譯的能力等等。日常開發中,除非有特別考慮,不然最好不要指望這種小技巧帶來所謂的效能提升。
  2. 不要在finally中使用return語句,finally總是執行,除非程式或者執行緒被終止。比如以下程式碼:
//try-catch異常退出、不被執行
try{
    system.exit(1)
}finally{
    println("會被執行嗎?")
}
複製程式碼
//try-catch無線迴圈,不被執行
try{
    while(true){
        println("do something")
    }finally{
        println("會被執行嗎?")
    }
}
複製程式碼

如果你非要在finally中使用return語句,請注意以下結論:

  • finally塊的語句是在try|catch的return語句執行之後,返回之前(try|catch中return在返回前,將其他所有操作都執行完,保留返回的值)。
  • finally中return語句會覆蓋try|catch中return語句直接返回。

具體程式碼實踐請參考文章:Java finally語句到底是在return之前還是之後執行? try-catch-finally語句中return的執行順序思考

  1. final不是immutable。(類似:String為什麼需要final修飾?HashMap、HashSet的鍵值為什麼不要使用不可變型別?)除了immutable內部如何實現的,個人認為主要作用:
  • 安全,尤其併發的時候執行緒安全
  • 類似String設計成immutable有著一個字串常量池的屬性,這樣存在大量字串的時候,節省記憶體空間、提高效率。具體類似討論可以參考知乎文章:在java中String類為什麼要設計成final?
  1. 小插曲,對Java的finalizer,cleaner的理解。有興趣可以參考文章:Java的finalizer,cleaner等如何實現? Effective Java 第三版——8. 避免使用Finalizer和Cleaner機制

參考:

宣告:此為原創,轉載請聯絡作者


作者:微信公眾號新增公眾號-遛狗的程式設計師 ,或者可以掃描以下二維碼關注相關技術文章。

qrcode_for_gh_1ba0785324d6_430.jpg
當然喜愛技術,樂於分享的你也可以可以新增作者微訊號:

WXCD.jpeg

相關文章