網站首頁 編程語言 正文
接口與函數類型
業務開發中,經常會有實現一個函數式接口(即接口只有一個方法需要實現)的場景,大家應該都會不假思索的寫出如下代碼:
interface Callback { fun response(): String } class Achieve: Callback { override fun response(): String { return "" } }
這么寫當然沒什么毛病,甚至為了讓kotlin支持對接口Callback
的SAM
轉換,你還可以在接口前面增加一個fun
修飾:
fun interface Callback { fun response() }
但是對于Kotlin而言,本身函數類型是可以被實現的,也就是說我們可以使用函數類型替換函數式接口,讓子類去實現,代碼如下:
class Achieve: () -> String { override fun invoke(): String { return "" } }
這種實現函數類型的類需要重寫的方法都是invoke()
,方法返回值類型對應的就是函數類型的返回值類型。
這種寫法我在LeakCanary
的源碼中就看到了應用,比如監聽Fragment
是否銷毀的類AndroidOFragmentDestroyWatcher
:
在這里寫下我對這兩種方式優缺點的比較:
1.函數類型相比較于接口去實現的優點如下:
參數類型更加直觀
某個類實現了函數類型,能直觀的看到這個函數類型需要傳入的參數有哪些,是什么類型,返回值又是什么類型,而如果實現了一個接口,一般大家都習慣跳轉到接口定義的地方看接口方法的實現,所以這一點函數類型會更加方便些
檢索更方便
函數類型需要重寫的方法名一定叫invoke
,所以如果我需要看下某個實現類對重寫方法的具體實現邏輯,直接在當前類中搜索invoke
關鍵字定位到這個方法即可;而如果是一個接口接口,我得跳轉到接口的定義的地方看接口方法名是什么,才能去實現類中去搜索,所以在這點上函數類型會更加方便些
2.函數類型相比較于接口去實現的缺點如下:
函數類型語義性會比較差:
畢竟定義的接口名一般是和業務進行綁定的,能大概知道這個接口是干啥用的,更加清晰直觀,當然這個問題我們可以使用typealias
解決,但就會失去上面參數類型更加直觀的優點
多態性會比較差(自己編的,不知道合不合理)
比如如果定義的一個接口去實現,我們很容易實現下面這種功能:
fun test(achieve: Achieve) { if (achieve is Callback) { //實現某些邏輯 } }
而如果使用函數類型去實現這種邏輯:
看起來是不是很奇怪,而且對于很多需要重寫的方法簽名都是相同的(方法參數和返回值都是相同的),根本無法實現這種功能,具體的看下面一點的描述。
無法實現多個相同的函數類型
業務場景中也存在實現多個接口,并且接口定義的方法參數和返回值類型都是相同的,比如下面:
fun interface Callback { fun response(): String } fun interface Callback2 { fun response2(): String } class Achieve2: Callback, Callback2 { override fun response(): String { return "" } override fun response2(): String { return "" } }
如果使用函數類型根本無法實現上面的這種多個接口實現的功能:
直接進行報錯。
總結
不管是實現函數類型還是接口,兩者都各有其優缺點,大家需要根據業務場景進行具體的選擇
原文鏈接:https://juejin.cn/post/7149562121863299080
相關推薦
- 2022-01-25 項目啟動的時候報Exception in thread main 錯誤解決方法
- 2023-05-23 Django?事務回滾的具體實現_python
- 2022-10-15 Tomcat生命周期詳解_Tomcat
- 2022-12-01 Go語言常用的打log方式詳解_Golang
- 2022-04-01 C#對Xamarin框架進行數據綁定_C#教程
- 2022-08-17 C語言超全面講解字符串函數_C 語言
- 2022-05-24 調用無文檔說明的?Web?API過程描述_相關技巧
- 2023-02-27 C++文件讀取的4種情況匯總_C 語言
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支