在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ Android/ 函數(shù)調(diào)用時(shí),傳遞參數(shù)應(yīng)該是不可變的(Immutable)
Launch mode 和 Intent flags專題
Canvas & Drawables
UTAustinX_UT.9.01x: Effective Thinking Through Mathematics
《JavaScript 語(yǔ)言精粹》
Memory leak專題
React基礎(chǔ)
《Test Driven Development: By Example》一書
Developer tools
安卓開發(fā)技能樹
<a rel="nofollow" href="https://mp.weixin.qq.com/s?__biz=MzA3NDM
Best Practices for Interaction and Engagement
各個(gè)安卓版本引入的主要新特性
Building Apps with Connectivity &amp; the Cloud
List.toArray()再?gòu)?qiáng)轉(zhuǎn)是一定會(huì)失敗的
深入Android frameworks
Google dev 100 days系列視頻
Building Apps with Contacts &amp; Sign-In
關(guān)系型數(shù)據(jù)庫(kù)設(shè)計(jì)范式
《App研發(fā)錄》一書
REST API設(shè)計(jì)
Google IO 2015摘要
自定義View/ViewGroup以及高性能實(shí)現(xiàn)自定義UI
安卓系統(tǒng)點(diǎn)擊事件處理
《50 Android Hacks》一書
Building Apps with Content Sharing
Flux基礎(chǔ)
<a rel="nofollow" href="http://developer.android.com/training/in
依賴注入(以Dagger 2為例)
Java同步機(jī)制
Java對(duì)象內(nèi)存的使用情況
JSR133(Java memory model)
Google官方Material Design手冊(cè)(<a rel="nofollow" href="http://develop
Futurice公司安卓團(tuán)隊(duì)的建議
安卓性能優(yōu)化
  • 1.
Best Practices for Performance
<a rel="nofollow" href="http://www.vogella.com/tutorials/Android
<a rel="nofollow" href="http://blog.danlew.net/2014/11/19/styles
Handling Runtime Changes
<a rel="nofollow" href="http://www.vogella.com/tutorials/Android
Building Apps with Graphics &amp; Animation
<a rel="nofollow" href="http://tools.android.com/tech-docs/new-b
Android項(xiàng)目架構(gòu)
MVP(Model-View-Presenter)模式
<a rel="nofollow" href="http://www.infoq.com/cn/es6-in-depth/"">
《Android源碼設(shè)計(jì)模式解析與實(shí)戰(zhàn)》一書
Rx在Android中的最佳實(shí)踐
函數(shù)調(diào)用時(shí),傳遞參數(shù)應(yīng)該是不可變的(Immutable)
ProGuard
面向?qū)ο罅笤瓌t(SOLID+)
深入理解Java虛擬機(jī)
深入Java深淺拷貝、immutable、unmodifiable
Best Practices for User Input
UI上的一些高效方式/最佳實(shí)踐
<a rel="nofollow" href="https://blog.stylingandroid.com/ripples-
Best Practices for User Interface
安卓測(cè)試驅(qū)動(dòng)開發(fā)/安卓測(cè)試驗(yàn)證
暗時(shí)間:學(xué)會(huì)正確思考
技術(shù)筆記
Aspect Oriented Programming(AOP)
Best Practices for Background Jobs
安卓系統(tǒng)動(dòng)效專題
Feed系統(tǒng)的設(shè)計(jì)
Data binding(MVVM,Model-View-ViewModel)
Effective Java一書筆記
<a rel="nofollow" href="http://developer.android.com/training/in
Rx (Reactive eXtention)
MultiDex專題
一些很棒的點(diǎn)子
WebRTC

函數(shù)調(diào)用時(shí),傳遞參數(shù)應(yīng)該是不可變的(Immutable)

考慮以下代碼:

Hashmap map = new HashMap(); 
map.put("key", "value") 
service.doSomething(map); 
map.clear() 

測(cè)試時(shí)想要驗(yàn)證doSomething調(diào)用時(shí)的參數(shù)內(nèi)容(狀態(tài)),使用Mockito的ArgumentCaptor,capture到的都將是空的map,因?yàn)閏apture到的對(duì)象,在調(diào)用doSomething后,又被修改了(clear)。
一方面目前Mockito的實(shí)現(xiàn),并非capture時(shí)立即創(chuàng)建參數(shù)的副本,而是直接持有其引用,所以后面的修改在將會(huì)生效,即修改操作發(fā)生后,再進(jìn)行驗(yàn)證,參與驗(yàn)證的將是修改后的值。
但是另一方面來(lái)看,這也是設(shè)計(jì)上的缺陷(code/design smell),更優(yōu)雅的方式應(yīng)該是在函數(shù)調(diào)用時(shí)傳入不可變的對(duì)象,這樣也會(huì)避免隱藏的bug,例如:被調(diào)用函數(shù)并未立即使用參數(shù),而是在回調(diào)中/異步線程中使用參數(shù),因此即便函數(shù)調(diào)用是同步進(jìn)行的,后續(xù)的修改也會(huì)導(dǎo)致被調(diào)用函數(shù)使用參數(shù)時(shí)值發(fā)生了變化。
更好的方式是這樣的:

Map map = new HashMap();
map.put("key", "value")
service.doSomething(map);
Map mapTwo = new HashMap();
mapTwo.put("key2", "value2");
serviceTwo.doSomethingElse(mapTwo);

另外,使用AutoValue/AutoParcel可以很方便的創(chuàng)建不可變的對(duì)象,但是在使用過程中還是容易“入坑”,例如使用了Collection類,即便元素對(duì)象是不可變的,但是collection并不是,如果按照上面的方式去實(shí)現(xiàn),依然會(huì)導(dǎo)致問題,一方面,新new一個(gè)Map是一種解決方式,另一方面,如果是使用List,可以通過變長(zhǎng)參數(shù)的方式來(lái)傳遞,這樣就能避免這一問題,變長(zhǎng)參數(shù)使用時(shí)仍然可能會(huì)有問題,例如:調(diào)用時(shí)傳遞的是一個(gè)數(shù)組對(duì)象,而非手動(dòng)傳遞多個(gè)參數(shù),那么如果多次調(diào)用之間傳遞的是同一個(gè)數(shù)組對(duì)象,那還是存在上面的問題,所以,無(wú)需變成傳遞變長(zhǎng)參數(shù),而是在調(diào)用時(shí)保證之后不再修改參數(shù)對(duì)象(TODO:go語(yǔ)言中有把數(shù)組打散之后傳遞的語(yǔ)法,是否能避免此問題?)。

參考: Google網(wǎng)上論壇

update at 2015. 09. 15
經(jīng)過更多的實(shí)踐與思考,我對(duì)上述問題有了新的認(rèn)識(shí),上述問題的解決,只能放到函數(shù)調(diào)用方來(lái)做,即便在被調(diào)用方的第一行代碼對(duì)傳入?yún)?shù)進(jìn)行一次深拷貝,還是無(wú)法保證深拷貝這一操作會(huì)早于調(diào)用方后續(xù)的修改。只能通過限制/強(qiáng)制保證調(diào)用方傳進(jìn)來(lái)的數(shù)據(jù)就是不會(huì)且不可改變的數(shù)據(jù),才能避免此問題。
而如何保證這一點(diǎn),可以通過調(diào)用方傳參時(shí)進(jìn)行深拷貝,或者unmodifiable+程序員保證調(diào)用后不再讀寫該數(shù)據(jù),來(lái)實(shí)現(xiàn)。
更多閱讀