欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

聊聊關于Java方法重寫的反思

 更新時間:2023年05月24日 17:05:07   作者:樂征skyline  
最近在開發(fā)中遇到一個關于Java方法重寫的一些問題,對于方法重寫的用法以及可能導致的問題產生了一些思考,本文用于記錄下這些想法,希望對大家也有所幫助

最近在開發(fā)中遇到一個關于Java方法重寫的一些問題,對于方法重寫的用法以及可能導致的問題產生了一些思考,本文用于記錄下這些想法。

問題場景

我們首先來看兩段代碼:

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    switch (requestCode){
        case TAKE_PHOTO_CODE:{
            //處理拍照得到的結果
            break;
        }
        case CHOOSE_FROM_ALBUM_CODE:{
            //處理相冊選取到的結果
            break;
        }
    }
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    switch (requestCode){
        case TAKE_PHOTO_CODE:{
            //處理拍照得到的結果
            break;
        }
        case CHOOSE_FROM_ALBUM_CODE:{
            //處理相冊選取到的結果
            break;
        }
        default:{
            super.onActivityResult(requestCode, resultCode, data);
        }
    }
}

這兩段代碼是Android開發(fā)中處理Activity結果的示例。Android啟動新頁面后,新頁面設置完結果返回的時候,舊頁面可以從這個方法得到新頁面的結果。來自不同頁面的結果按照參數(shù)中的requestCode來區(qū)分,這個requestCode和啟動新頁面時傳遞的對應,也就是說一個requestCode標識一個頁面請求和一個結果類型。例如,上面示例模擬的是常見APP中換用戶頭像的功能,結果有兩種:1. 拍照得到的結果;2. 相冊選取得到的結果。

上面兩種方法就結果來說都是對的,但是表達的意義不同:第一種寫法是純粹地擴展父類的方法,父類干的事它都干;而第二種寫法是改寫父類的方法,相當于重定義并依賴了父類的行為,或者說對父類行為做了攔截、訪問控制。

原本Activity類中默認實現(xiàn)是個空方法:

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
}

這種情況下兩種寫法的行為差異完全可以忽略不計,但是實際開發(fā)中我們一般繼承自FragmentActivityAppCompatActivity,這兩個類都對這個方法做了相應的實現(xiàn),在這種情況下,第一種寫法父類的實現(xiàn)一定會被執(zhí)行,但是第二種寫法可能將父類的實現(xiàn)短路了。這可能導致一些意料之外的問題,比如,Activity和Fragment都對某個requestCode進行處理,但第二種寫法會導致Fragment的對應onActivityResult方法不會被掉用。

在實際開發(fā)中我們可能會編寫一個BaseActivity,將一些方法實現(xiàn)一下并添加統(tǒng)計和日志,那么第二種寫法也可能導致日志丟失的問題。

問題分析

這個問題讓我聯(lián)想到一個設計原則:里氏替換原則(Liskov Substitution principle)。這個原則說明:派生類(子類)對象可以在程序中代替其基類(超類)對象。這表示程序中任何父類對象可以出現(xiàn)的位置,子類的對象都可將其替代。進一步解讀,就是意味著子類可以擴展父類的功能,但不能改變父類原有的功能。

這個原則考慮了安全性。編程時為了降低耦合度,通常面向抽象數(shù)據(jù)類型(例如接口、抽象類等)來編寫,而父類在編寫的時候也不會去考慮子類的實現(xiàn),那么就要求子類的實現(xiàn)的時候需要顧及父類的運行。

那么當我們在重寫父類方法的時候,情況就復雜了起來,具體分為以下幾種情況:

  • 當父類代碼和子類代碼都是同一個人負責的時候,并且在代碼同一項目、同一模塊。這種情況比較安全,因為編寫子類實現(xiàn)的人是完全了解并掌控父類實現(xiàn)的;
  • 當父類代碼和子類代碼是同一個人負責的時候,而代碼位于不同項目。例如,一個人同時維護一個應用項目和一個獨立框架。這種情況,就可能出隱患,因為隨著項目進行,這個框架中的父類可能被多個應用項目使用,這個父類就可能無法兼顧多個項目的場景和用法,而導致子類實現(xiàn)中錯誤地改寫父類的方法。
  • 當父類代碼和子類代碼時不同的人負責,且代碼位于不同項目時,這種情況就比較危險了。因為父類實現(xiàn)的行為實現(xiàn)和行為變更很可能是不透明的、未知的,而且父類的實現(xiàn)可能不會顧及到子類的應用。那么當子類改寫父類行為的時候,當父類行為發(fā)生變更,那么子類的實現(xiàn)很可能是有問題的。

方法與建議

針對上面所提到的三種情況,我思考了如下三個對應的建議:

  • 針對第一種安全的情況,盡量不改寫父類方法,在子類和父類實現(xiàn)中盡量補充注釋和注解說明;
  • 針對第二種有隱患的情況,盡量不改寫父類方法,父類設計無法涵蓋所有場景時,適當時候重構父類代碼,而不是讓子類通過“hack”的手段曲線救國。
  • 針對第三種危險的情況,一定不要改寫父類方法,可以考慮在方法第一行就super調用。

到此這篇關于聊聊關于Java方法重寫的反思的文章就介紹到這了,更多相關Java方法重寫內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • java 實現(xiàn)音樂播放器的簡單實例

    java 實現(xiàn)音樂播放器的簡單實例

    這篇文章主要介紹了java 實現(xiàn)音樂播放器的簡單實例的相關資料,希望通過本文能幫助到大家,實現(xiàn)這樣的功能,需要的朋友可以參考下
    2017-09-09
  • Java中instanceof 關鍵字的使用

    Java中instanceof 關鍵字的使用

    instanceof通過返回一個布爾值來指出,某個對象是否是某個特定類或者是該特定類的子類的一個實例,本文就來詳細的介紹一下instanceof 關鍵字的使用,感興趣的可以了解一下
    2023-10-10
  • shade解決mybatis包沖突問題及項目引用的方法

    shade解決mybatis包沖突問題及項目引用的方法

    這篇文章主要介紹了shade解決mybatis包沖突問題及項目引用的方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-08-08
  • Spring框架中部署log4j.xml的詳細步驟

    Spring框架中部署log4j.xml的詳細步驟

    Log4j是一個常用的日志記錄工具,它可以幫助我們記錄應用程序的運行日志并進行靈活的配置,在Spring框架中,我們可以很方便地部署log4j.xml配置文件來管理日志記錄,這篇文章主要介紹了Spring框架中部署log4j.xml的詳細步驟并提供相應的代碼示例,需要的朋友可以參考下
    2023-09-09
  • SpringBoot集成Swagger3的實現(xiàn)

    SpringBoot集成Swagger3的實現(xiàn)

    本文主要介紹了SpringBoot集成Swagger3的實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • Java Spring登錄練習詳解

    Java Spring登錄練習詳解

    這篇文章主要介紹了Java編程實現(xiàn)spring簡單登錄的練習,具有一定參考價值,需要的朋友可以了解下,希望能夠給你帶來幫助
    2021-10-10
  • JAVA 多態(tài) 由淺及深介紹

    JAVA 多態(tài) 由淺及深介紹

    JAVA 多態(tài) 由淺及深介紹,什么是多態(tài)?多態(tài)的詳細解釋,多態(tài)的好處,多態(tài)的實際運用等
    2013-03-03
  • Java ThreadPoolExecutor的參數(shù)深入理解

    Java ThreadPoolExecutor的參數(shù)深入理解

    這篇文章主要介紹了Java ThreadPoolExecutor的參數(shù)深入理解的相關資料,需要的朋友可以參考下
    2017-03-03
  • Java并發(fā)工具之CyclicBarrier使用詳解

    Java并發(fā)工具之CyclicBarrier使用詳解

    這篇文章主要介紹了Java并發(fā)工具之CyclicBarrier使用詳解,CyclicBarrier是一個同步器,允許一組線程相互之間等待,直到到達某個公共屏障點(common barrier point),再繼續(xù)執(zhí)行,需要的朋友可以參考下
    2023-12-12
  • idea打不開雙擊IDEA圖標沒反應的快速解決方案

    idea打不開雙擊IDEA圖標沒反應的快速解決方案

    這篇文章主要介紹了idea打不開雙擊IDEA圖標沒反應的快速解決方案,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12

最新評論