最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

利用KSP開發(fā)Kotlin的深拷貝庫

2023-08-23 23:46 作者:萌新杰少  | 我要投稿

前言

????已經(jīng)有很長一段時間沒有見面了,在此期間因為參加比賽緣故沒有辦法去繼續(xù)更新視頻,不過這一切都將在今年的9月17日后結(jié)束,到時間再更新視頻。

????盡管我在這段時間沒有更新視頻,但是學習的腳步?jīng)]有停止,在最近我學習了KSP的相關(guān)內(nèi)容,雖然很淺,但是我還是想嘗試一下,因此,一個Kotlin的對象深拷貝庫——DeepReCopy就誕生了!

????但是該庫目前只是做出來了,只在我和另外一位貢獻者中測試過,因此現(xiàn)在需要對該庫有興趣的開發(fā)者對該庫進行嘗試,隨時愿意聽取意見。

????GitHub:https://github.com/1250422131/DeepReCopy

????假設你已經(jīng)了解深拷貝是什么了,那么請?zhí)^下面,直接看這個庫如何使用!

什么是深拷貝?

假設我們有一個Data類,就像是下面這樣

????設想一下它會發(fā)生什么?沒錯,你確實得到了一個新的DocInfo對象,它的內(nèi)容與原來的對象一樣,但是確實一個新的對象。

????那么你認為UserInfo會是什么情況呢?

????下面是輸出結(jié)果,這里要提到一點的是,kotlin中的"=="是比較兩個對象的值是否相同,而"==="則是比較引用地址是否相同。

????結(jié)果實際上和我們預想的是一樣的,但是我們發(fā)現(xiàn)其中的UserInfo卻沒有改變?

????這就是典型的淺拷貝,也許這樣還比較抽象,那么我們看看下面的圖,為什么會造成這樣的現(xiàn)象。

????顯然,我們發(fā)現(xiàn)淺拷貝只是單純的把內(nèi)存地址拷貝了過來,也就是說,雖然上面產(chǎn)生了新的DocInfo對象,但是新舊DocInfo中持有對象的內(nèi)存地址是一致的。

????但有時候我們需要拷貝后內(nèi)部對象也是一個新對象,而不是只拷貝其中的內(nèi)存地址。

例子:為了提高數(shù)據(jù)利用效率,我們會對比新舊兩個數(shù)據(jù)是否發(fā)生了變化,但假設新的數(shù)據(jù)是拷貝舊的數(shù)據(jù)后改變了部分內(nèi)容,由于沒有深拷貝,改變新的數(shù)據(jù),相當于改變了舊的數(shù)據(jù),這樣就會出現(xiàn)問題。

????當然,除此之外還有列表拷貝,往往我們新的數(shù)組需要對舊的調(diào)整,假設不深拷貝,也會出現(xiàn)類似問題。

????所以我想做一個深拷貝的庫,就像是下面這樣:

????這樣我們得到的新的對象,其內(nèi)部的對象也是新的,就是這樣DeepReCopy這個庫就誕生了!

庫的引入

????DeepReCopy就是為了解決深拷貝問題而誕生的,它可以通過對一個類加特殊注解,來對其生成深拷貝的擴展函數(shù)。

????讓我們看看如何在Android項目中引入DeepReCopy!

????首先在根項目的gradle腳本里添加ksp的插件

????接下來在你項目模塊的頂部引入KSP

????最后我們加入依賴就可以使用DeepReCopy了

庫的使用介紹

????我們在導入了庫之后就可以在需要被深拷貝的類上加@EnhancedData,但是注意,UserInfo也需要深拷貝,因此它需要注解@EnhancedData,不過不用擔心,對于Kotlin自己的類我們會有其他辦法進行深拷貝,你可以不用在意(前提是它有辦法被深拷貝)。

????OK,添加完成后現(xiàn)在還不可以使用,因為KSP是進行代碼生成,因此需要執(zhí)行build。

????點擊這個位置即可,舊版本也是這個圖標,等build完成。

????完成后這個類會有一個擴展方法,叫做deepCopy,這里接受一個lambda表達式,里邊就可以像copy()方法一樣改變對象的值。

????猜測下這次會怎么樣?

????啊哈,我們發(fā)現(xiàn)UserInfo的對象被改變了,相當于產(chǎn)生了新的UserInfo,這樣深拷貝就完成了!

DeepReCopy做了什么?

? ? 我們按住ctrl點擊deepCopy方法,看看是什么?

????事實上下面的代碼就是通過KSP完成的,DeepReCopy通過識別類的元信息生成了下面的代碼,我們調(diào)用的deepCopy就來自這里。

????這里我們發(fā)現(xiàn)有兩個deepReCopy,這是因為我想讓它支持DSL寫法,傳入copyFunction的就是支持DSL寫法的函數(shù),剛剛我們調(diào)用的就是它啦。

? ?目前DeepReCopy已經(jīng)支持了List、Map、Set的深拷貝,對于其他沒有被@EnhancedData注解的對象,我們會檢查是否實現(xiàn)了序列化接口,假設沒有則檢查是否存在clone方法,假設都不具備那么對這個對象就不支持深拷貝了。

? ?這個庫的詳細開發(fā)見:https://juejin.cn/post/7266368395787010102

文末

????事實上做這個庫最開始是我看了霍佬的KSP推廣視頻,視頻內(nèi)講述的正是Data類深拷貝的問題,得到啟發(fā)后我就試著實現(xiàn)了DeepReCopy這個庫。

????DeepReCopy目前需要大家的測試和反饋,如果覺得庫還不錯記得Star

????GitHub:https://github.com/1250422131/DeepReCopy


利用KSP開發(fā)Kotlin的深拷貝庫的評論 (共 條)

分享到微博請遵守國家法律
仲巴县| 治县。| 庆阳市| 漳州市| 阳城县| 南雄市| 鸡东县| 长春市| 无锡市| 莱芜市| 宁德市| 沙坪坝区| 陵水| 沁水县| 丹寨县| 花莲县| 江津市| 镇赉县| 哈密市| 香河县| 手游| 澎湖县| 崇文区| 汾西县| 竹山县| 张家界市| 南汇区| 安远县| 伊宁县| 道真| 石屏县| 禄丰县| 武胜县| 尚志市| 庆元县| 屯昌县| 江北区| 山东| 黔江区| 翁牛特旗| 本溪市|