鍍金池/ 教程/ Android/ 深入Java深淺拷貝、immutable、unmodifiable
Launch mode 和 Intent flags專題
Canvas & Drawables
UTAustinX_UT.9.01x: Effective Thinking Through Mathematics
《JavaScript 語言精粹》
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()再強(qiáng)轉(zhuǎn)是一定會失敗的
深入Android frameworks
Google dev 100 days系列視頻
Building Apps with Contacts &amp; Sign-In
關(guān)系型數(shù)據(jù)庫設(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對象內(nèi)存的使用情況
JSR133(Java memory model)
Google官方Material Design手冊(<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
安卓測試驅(qū)動開發(fā)/安卓測試驗(yàn)證
暗時(shí)間:學(xué)會正確思考
技術(shù)筆記
Aspect Oriented Programming(AOP)
Best Practices for Background Jobs
安卓系統(tǒ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

深入Java深淺拷貝、immutable、unmodifiable

  • 建議:函數(shù)調(diào)用的時(shí)候,調(diào)用方傳給被調(diào)用方的參數(shù),如果在調(diào)用之后還會被修改,那么調(diào)用方應(yīng)該給被調(diào)用方傳一個(gè)當(dāng)時(shí)的拷貝,深拷貝,否則:
    • 可能被調(diào)用方是異步執(zhí)行的,如果調(diào)用函數(shù)之后,參數(shù)發(fā)生了修改,那么被調(diào)用方執(zhí)行的時(shí)候,看到的就是被修改之后的數(shù)據(jù),這將導(dǎo)致嚴(yán)重、隱蔽、非必現(xiàn)的BUG,而這種BUG是最讓人頭疼的
    • 可能被調(diào)用方會修改傳入的參數(shù),這就導(dǎo)致函數(shù)執(zhí)行完畢之后,調(diào)用方看到的數(shù)據(jù)發(fā)生了非預(yù)期的變化,這同樣會導(dǎo)致嚴(yán)重、隱蔽的BUG
  • 深拷貝:這里需要弄清楚深淺拷貝的區(qū)別,用“=”號給非基本類型賦值,均是淺拷貝,例如List,以下代碼就是淺拷貝:
      List<Integer> list1 = new ArrayList<>();
      list1.add(1);
      List<Integer> list2 = list1;
      list1.add(2);

    代碼執(zhí)行完畢之后,list2將包含整數(shù)1和2。
    而以下代碼則是深拷貝:

      List<Integer> list1 = new ArrayList<>();
      list1.add(1);
      List<Integer> list2 = new ArrayList<>(list1);
      list1.add(2);

    代碼執(zhí)行完畢之后,list2將只包含整數(shù)1,不包含整數(shù)2。

  • Immutable對象:上述情形如果遇到immutable對象,即不可變對象,其實(shí)是不需要深拷貝的(不僅不需要,還應(yīng)該杜絕拷貝,因?yàn)榧儗倮速M(fèi))。但是前提是對象是真正的immutable。反面例子為:

      public class NonStrictlyImmutable {
          private final List<Integer> mList = new ArrayList<>();
    
          public List<Integer> getList() {
              return mList;
          }
      }

    mList成員設(shè)置為了private final,NonStrictlyImmutable對象實(shí)例化完成后mList所引用的實(shí)際對象也不可再被改變,然而mList這個(gè)List的元素確是可以改變的,nonStrictlyImmutable.getList().add(1)并不會報(bào)編譯錯(cuò)誤,而這一行代碼卻實(shí)實(shí)在在改變了nonStrictlyImmutable對象的值!
    而如果getList()函數(shù)不直接返回mList引用,創(chuàng)建一個(gè)副本,或者使其不可被改變,則可以達(dá)到”嚴(yán)格意義上的“immutable。例如:

      public class NonStrictlyImmutable {
          private final List<Integer> mList = new ArrayList<>();
    
          public List<Integer> getList() {
              // 以下兩種方式都可以,各有優(yōu)劣
              // return new ArrayList<>(mList);
              // return Collections.unmodifiableList(mList);
    
              return Collections.unmodifiableList(mList);
          }
      }

    上面兩種方式各有優(yōu)劣:前者允許對新獲取到的副本進(jìn)行修改操作而不會拋出異常,但會把底層數(shù)組數(shù)據(jù)創(chuàng)建多份;后者不會創(chuàng)建多份底層數(shù)組數(shù)據(jù),但是如果對getList()返回的引用進(jìn)行修改操作,將會拋出異常;見仁見智。

  • unmodifiable:unmodifiable不等于immutable,所以對于前面提到的建議做法,直接傳入unmodifiable是不對的,因?yàn)檫@樣只能阻止被調(diào)用方修改傳入數(shù)據(jù)后導(dǎo)致調(diào)用方出錯(cuò),并不能阻止調(diào)用方修改后導(dǎo)致被調(diào)用方出錯(cuò)。unmodifiable并未拷貝底層數(shù)組數(shù)據(jù),而是實(shí)現(xiàn)了另外一個(gè)List的實(shí)現(xiàn)類,該類的修改操作均拋出異常。