日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
從EffectiveJava總結(jié)一些有助安卓開發(fā)的建議

在編寫長期運行下既易于維護(hù)又能保持高效的 Java 代碼這方面 ,《Effective Java》 被很多人看做最重要的書之一。 Android 使用的是 Java 語言,這就意味著這本書中所有給出的建議一定都是適用與 Android 的,對嗎?答案是:不一定。

創(chuàng)新互聯(lián)建站不只是一家網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司;我們對營銷、技術(shù)、服務(wù)都有自己獨特見解,公司采取“創(chuàng)意+綜合+營銷”一體化的方式為您提供更專業(yè)的服務(wù)!我們經(jīng)歷的每一步也許不一定是最完美的,但每一步都有值得深思的意義。我們珍視每一份信任,關(guān)注我們的成都網(wǎng)站設(shè)計、成都網(wǎng)站建設(shè)質(zhì)量和服務(wù)品質(zhì),在得到用戶滿意的同時,也能得到同行業(yè)的專業(yè)認(rèn)可,能夠為行業(yè)創(chuàng)新發(fā)展助力。未來將繼續(xù)專注于技術(shù)創(chuàng)新,服務(wù)升級,滿足企業(yè)一站式營銷型網(wǎng)站建設(shè)需求,讓再小的品牌網(wǎng)站建設(shè)也能產(chǎn)生價值!

有些人認(rèn)為這本書給出的大多數(shù)建議都不適用于 Android 開發(fā)。在我看來,也并非如此。我認(rèn)為這本書中有一部分是不適用的,因為不是所有的 Java 特性都是為了用于 Android 而優(yōu)化的(比如枚舉,序列化等等),也因為移動設(shè)備存在自身的限制(比如 Dalvik/ART 表現(xiàn)和 JVM 不同)。盡管如此,這本書中的大多數(shù)范例還是能夠不加修改或者少量修改地被使用,并能夠有助于建立一個更加健康、干凈和可維護(hù)的代碼庫。

本文關(guān)注于這本書中我認(rèn)為對于 Android 開發(fā)至關(guān)重要的知識點。對于閱讀過這本書的人來說,本文可以作為書中提到的原則/知識的回顧。對于那些(目前)還沒有讀過的人來說,本文可以給他們一個機(jī)會去嘗試下這本書。

強(qiáng)制不可實例化

如果你不希望使用 new 關(guān)鍵字來創(chuàng)建一個對象,那就強(qiáng)制使用私有構(gòu)造器(private constructor)。這對于僅包含靜態(tài)方法的工具類來說更加有用。

 
 
 
 
  1. List latestMovies() { 
  2.     if (db.query().isEmpty()) { 
  3.         return Collections.emptyList(); 
  4.     } 
  5.     [...] 
  6. }  

靜態(tài)工廠

不要使用 _new_ 關(guān)鍵字和構(gòu)造器,使用靜態(tài)工廠方法(以及一個私有的構(gòu)造器)。這些工廠方法是命名的,不需要每次都返回一個新的對象實例,而且可以根據(jù)需要返回不同的子類型。

 
 
 
 
  1. class Movie { 
  2.     [...] 
  3.     public static Movie create(String title) { 
  4.         return new Movie(title); 
  5.     } 
  6. }  

【更新】讀者 @ stsdema28 提出了一個有用的建議:使用靜態(tài)工廠會使得測試變得困難。如果這樣的話,不妨考慮使用一個非靜態(tài)的工廠用于在測試時進(jìn)行模擬(或者一個能夠?qū)崿F(xiàn)的工廠接口)。

Builders

當(dāng)你有需要三個以上的構(gòu)造參數(shù)時,使用 Builder 去構(gòu)造這個對象。寫起來可能有點啰嗦但是這樣伸縮性和可讀性都很好。如果你創(chuàng)建的是值類型,考慮 AutoValue。

 
 
 
 
  1. class Movie { 
  2.     static Builder newBuilder() { 
  3.         return new Builder(); 
  4.     } 
  5.     static class Builder { 
  6.         String title; 
  7.         Builder withTitle(String title) { 
  8.             this.title = title; 
  9.             return this; 
  10.         } 
  11.         Movie build() { 
  12.             return new Movie(title); 
  13.         } 
  14.     } 
  15.   
  16.     private Movie(String title) { 
  17.     [...]     
  18.     } 
  19. // Use like this: 
  20. Movie matrix = Movie.newBuilder().withTitle("The Matrix").build();  

避免可變性

不可變對象在其整個生命周期中都保持不變。所有需要的數(shù)據(jù)都在對象創(chuàng)建時提供。這種方式有著多種優(yōu)點,如簡單,線程安全以及可共享。

 
 
 
 
  1. class Movie { 
  2.     [...] 
  3.     Movie sequel() { 
  4.         return Movie.create(this.title + " 2"); 
  5.     } 
  6. // Use like this: 
  7. Movie toyStory = Movie.create("Toy Story"); 
  8. Movie toyStory2 = toyStory.sequel();  

或許很難做到每個類都不可變。對于這種情況,盡可能使你的類變得不可變(比如使用 private final 字段,final 類聲明)。在移動設(shè)備上創(chuàng)建對象代價更加昂貴,因此不要過度使用。

靜態(tài)成員類

如果你定義了一個不依賴于外部類的內(nèi)部類,別忘了將其定義為靜態(tài)的。不這么做的話會導(dǎo)致每個內(nèi)部類的實例都會擁有對外部類的引用。

 
 
 
 
  1. class Movie { 
  2.     [...] 
  3.     static class MovieAward { 
  4.         [...] 
  5.     } 
  6. }  

泛型(幾乎)無處不在

Java 提供了類型安全的特性,我們應(yīng)對此心懷感激(看看JS吧)。盡量避免使用原始類型 (raw types)或者對象類型。泛型大多數(shù)情況下都提供了讓你的代碼在編譯時類型安全的機(jī)制。

 
 
 
 
  1. // DON'T 
  2. List movies = Lists.newArrayList(); 
  3. movies.add("Hello!"); 
  4. [...] 
  5. String movie = (String) movies.get(0); 
  6.   
  7. // DO 
  8. List movies = Lists.newArrayList(); 
  9. movies.add("Hello!"); 
  10. [...] 
  11. String movie = movies.get(0);  

別忘了你能在函數(shù)的參數(shù)和返回值中使用泛型。

 
 
 
 
  1. // DON'T 
  2. List sort(List input) { 
  3.     [...] 
  4.   
  5. // DO 
  6.  List sort(List input) { 
  7.     [...] 
  8. }  

為了更加靈活你可以使用 bounded wildcards 來拓展可接受的類型的范圍。

 
 
 
 
  1. // Read stuff from collection - use "extends" 
  2. void readList(List movieList) { 
  3.     for (Movie movie : movieList) { 
  4.         System.out.print(movie.getTitle()); 
  5.         [...] 
  6.     } 
  7.   
  8. // Write stuff to collection - use "super" 
  9. void writeList(List movieList) { 
  10.     movieList.add(Movie.create("Se7en")); 
  11.     [...] 
  12. }  

返回空(列表/集合)

當(dāng)必須返回空的列表/集合時,避免使用null。返回一個空的集合會產(chǎn)生一個更簡單的接口(不需要去進(jìn)行文檔注釋并聲明函數(shù)返回值為 null),還能避免意外的空指針異常。***返回一個相同的空集合而不是創(chuàng)建一個新的。

 
 
 
 
  1. List latestMovies() { 
  2.     if (db.query().isEmpty()) { 
  3.         return Collections.emptyList(); 
  4.     } 
  5.     [...] 
  6. }  

不要用 + 連接 String

如果要連接幾個字符串,+ 操作符或許可以。但永遠(yuǎn)不要使用它來進(jìn)行大量的字符串連接,那樣性能會十分糟糕。***使用 StringBuilder 來代替。

 
 
 
 
  1. String latestMovieOneLiner(List movies) { 
  2.     StringBuilder sb = new StringBuilder(); 
  3.     for (Movie movie : movies) { 
  4.         sb.append(movie); 
  5.     } 
  6.     return sb.toString(); 
  7. }  

可恢復(fù)的異常

我不喜歡通過拋出異常來指明錯誤,但如果你這樣做的話,就要確保異常被檢查并且異常的捕獲者能夠從錯誤中恢復(fù)。

 
 
 
 
  1. List latestMovies() throws MoviesNotFoundException { 
  2.     if (db.query().isEmpty()) { 
  3.         throw new MoviesNotFoundException(); 
  4.     } 
  5.     [...] 
  6. }  

總結(jié)

列舉的這些不是這本書中所給出的完整建議,也不是簡短說明深入評價。只是這些有用的建議的一紙小抄而已 :)。


分享文章:從EffectiveJava總結(jié)一些有助安卓開發(fā)的建議
當(dāng)前URL:http://www.dlmjj.cn/article/dpgespc.html