寫在開頭:
????? Android源碼的過程辜昵,動(dòng)輒好幾千行、好幾萬行代碼咽斧,大多數(shù)人肯定是看著就雙卵一緊堪置、背脊一涼,一句“我CAO NI MA BI”就close掉頁面收厨,略過了晋柱!而且也或多或少的會(huì)覺得,這些東西都應(yīng)該是大神級(jí)別的人物寫出來的東西诵叁,真害怕自己領(lǐng)略不到大神們的奇思妙想和鬼斧神工雁竞。?
????? 對(duì)我而言,最開始也是這樣的拧额。但是當(dāng)鄙人靜下心來碑诉,緊一緊本人的蛋,收一收菊花侥锦,邊扣著鼻屎进栽,邊咬著牙去慢慢看的時(shí)候,首先發(fā)現(xiàn)的是在注釋里還是有好些拼寫錯(cuò)誤(看來恭垦,是人寫的東西快毛,就一定會(huì)有錯(cuò)誤和漏洞的啊)番挺,接著就是有些類的層次設(shè)計(jì)真是看不懂如此的意義在哪里唠帝,還有就是類結(jié)構(gòu)的設(shè)計(jì)以及方法的邏輯結(jié)構(gòu)和處理是好生奇怪⌒兀或許是我才疏學(xué)淺吧襟衰,真沒看出來大師、大神們粪摘、或者上古神獸們的匠心獨(dú)運(yùn)在哪里瀑晒。這里會(huì)陸續(xù)羅列一些我在閱讀源碼的過程中的一些分析和疑問绍坝,與所有的開發(fā)者一起共勉!
以上三張圖片沒啥名堂苔悦,只是這篇內(nèi)容所關(guān)注的東西的核心信息的介紹而已轩褐。接著來看這個(gè)類的幾個(gè)核心代碼:
getSpanEnd(Object what)、getSpanFlag(Object what)的處理和getSpanStart(Object what)是一樣的結(jié)構(gòu)间坐。那么可以得知成員變量mSpanData的存儲(chǔ)結(jié)構(gòu)是[{start, end, flag},? 灾挨, 邑退, ]邏輯上是一個(gè)int[][3]的二維數(shù)組竹宋,只是以一維數(shù)組的形式來操作。
那么問題來了:每次操作都得有四則運(yùn)算(涉及到數(shù)組遍歷是將產(chǎn)生大量的乘法運(yùn)算)地技,而且相關(guān)數(shù)據(jù)分布在兩個(gè)數(shù)組之中(mSpans蜈七、mSpanData),為啥不單獨(dú)設(shè)計(jì)一個(gè)數(shù)據(jù)結(jié)構(gòu)莫矗,來維護(hù)所有內(nèi)容飒硅,在邏輯上更直觀,處理起來也更方便作谚。這里僅僅只是為了炫技增加代碼的復(fù)雜度三娩,還是Java中沒有像C那樣的數(shù)據(jù)結(jié)構(gòu),只能設(shè)計(jì)單獨(dú)的一個(gè)類妹懒,相比用內(nèi)容拆分以及在數(shù)組處理技巧上的時(shí)間耗費(fèi)來換取維護(hù)一個(gè)類數(shù)組的內(nèi)存空間消耗雀监,作者通過效率考慮選擇前者,是真的有啥特別的深意么眨唬?不懂会前!
我們?cè)賮砜春诵牡娜齻€(gè)方法:
這個(gè)很好理解,沒啥可說的匾竿,但是看看setSpan方法瓦宜,可是讓我大吃一驚,好生奇怪:
第一個(gè)if語句對(duì)flag的判斷岭妖,就讓我好生奇怪临庇,估計(jì)是我確實(shí)不能完全理解這個(gè)類的使用,setSpan為啥要先對(duì)本來要set的flag做判斷昵慌,那這個(gè)set還有啥意義假夺?而if(mSpanCount + 1 >= mSpans.length)這個(gè)if判斷,要知道m(xù)Spans.length和mSpanCount++都得在該方法里面被操作的(而且還是這個(gè)if語句之后)废离,永遠(yuǎn)都會(huì)是true(排除在線程不安全的情況下)的if判斷侄泽,有何意義?難道真的是我才疏學(xué)淺蜻韭?
接著也是最后的超級(jí)大招兒:
這個(gè)方法悼尾,寫得是相當(dāng)?shù)钠婀质量郏耆幻骶屠铩0次覀冋5乃季S闺魏,一個(gè)span生效的范圍就是字串的某一子串未状,那么for循環(huán)內(nèi)部的那幾個(gè)if條件判斷,就是好生奇怪了析桥!不懂司草!還是for循環(huán)內(nèi),count作為if條件泡仗,來對(duì)篩選結(jié)果做處理埋虹,大家不覺得有些怪怪的。是不是感覺很是多此一舉娩怎,直接累加返回結(jié)果數(shù)組不久行了么搔课。以及臨時(shí)變量ret1做程序結(jié)構(gòu)的輔助,有這個(gè)必要么截亦?更不用說跳出循環(huán)后爬泥,在對(duì)最后的返回結(jié)果處理的時(shí)候,真真的不明白代碼這樣寫的意義何在崩瓤,最初直接一個(gè)預(yù)分配一個(gè)T[0]的ret數(shù)組袍啡,有匹配結(jié)果后,直接append却桶,我想效率不會(huì)是很差的吧境输!或者給一個(gè)T結(jié)構(gòu)的鏈表,最后結(jié)果處理成T[]返回肾扰!作者這樣count==0畴嘶、count==1的設(shè)計(jì),哎呀集晚,真心的看不懂按懊酢!
OK偷拔,分析到這里就結(jié)束了蒋院,本來不是一個(gè)和復(fù)雜的類,代碼也不是很多莲绰,只是我在看的時(shí)候欺旧,遇到的這些個(gè)問題,確實(shí)讓我好生困惑蛤签,這里寫出來辞友,希望有大神能看到,來鄙視我也好、解答困惑也好称龙,給些我能明白的解釋留拾!要說我去按我的思路去重寫該類,也不是不可以鲫尊,只是因?yàn)槲矣腥绱硕嗟睦Щ蟪杖幔f明可能我還沒能完全理解的這個(gè)類的結(jié)構(gòu)和用法,不敢冒此大不韙疫向!
Anyway咳蔚,這個(gè)SpannableString類名改成DecratableString或許更貼近它實(shí)際用法的意思!不是么搔驼!