版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
通用程序設計
將局部變量的作用域最小化最小化局部變量的方法:最有效的方法是在它第一次使用時聲明。幾乎每個局部變量聲明都應該包含一個初始值,否那么編譯也通不過。方法小而集中,每個方法僅僅處理一種活動。如果把兩個操作合并到同一個方法中,與其中一個操作相關的局部變量就有可能會出現(xiàn)在執(zhí)行另一個操作的代碼范圍之內。為了防止這種情況發(fā)生,只要把這個方法分成兩個,每個方法各執(zhí)行一個操作。for-each循環(huán)優(yōu)先于傳統(tǒng)的for循環(huán)集合上迭代優(yōu)先考慮:for(Iteratori=c.iterator();i.hasNext();){ doSomething((Element)i.next());}數(shù)組上迭代優(yōu)先考慮:for(inti=0;i<a.length;i++){ doSomething(a[i]);}這些習慣用法要好于while循環(huán)但也不完美。迭代器與索引都有些混亂。而且,它們還可能引起錯誤。在上面的循環(huán)中迭代器與索引都出現(xiàn)了三次,其中有兩個地方可能帶來錯誤,如果確實出現(xiàn)了這種錯誤,卻無法保證編譯器能捕獲到這些錯誤。
版本1.5引入的for-each循環(huán)從混亂中解脫出來了,而且完全擺脫了隱藏在迭代器與索引變量后的可能的出錯的時機。這種慣用法對集合與數(shù)組都適用:for(Elemente:elements){ doSomething(e);}for-each循環(huán)優(yōu)先于傳統(tǒng)的for循環(huán)〔續(xù)〕與傳統(tǒng)的for循環(huán)相比,在簡潔及預防bug方面,for-each循環(huán)有巨大的優(yōu)勢,而且沒有性能損耗。應該盡可能地使用for-each。但是有三種普遍情況無法使用for-each循環(huán):1、過濾——如果需要在集合上遍歷且刪除選定的元素,就要使用顯式的迭代,并調用它的remove方法。2、轉換——如果需要在list或數(shù)組上遍歷且要替換局部或所有的元素值,那么需要list的迭代器或數(shù)組的索引去設置這些值。3、平行迭代——如果需要并行的遍歷多個集合,那么需要顯式的控制迭代器或索引變量,以便所有的迭代器或索引能協(xié)同推進。了解和使用類庫不要重新創(chuàng)造輪子,如果你要做的事情是很常見的,就去查下有沒有這樣的實現(xiàn)類,如果有,那么使用它,這樣會降低你實現(xiàn)相應功能的投入和代碼的出錯率。使用標準庫的好處:通過使用標準庫,你可以充分利用這些編寫標準庫的專家知識,以及在你之前其他人的使用經驗。不必浪費時間為那些與工作不太相關的問題提供特別的解決方案。它們的性能往往會隨著時間的推移而不斷提高,無需你做任何努力??梢允棺约旱拇a融入主流,這樣的代碼更易讀、更易維護、更易被大多數(shù)的開發(fā)人員重用。比較常見的一些標準類庫java.lang、java.util、java.io如果要求精確的答案,請防止使用float和doublefloat和double主要是為了在科學計算和工程計算提供較為精確,快速的近似計算設計的。沒有提供完全精確的結果,所以不應該用在要求精確結果的場合。特別是不適合表示貨幣,在平時的使用中應該防止。例: System.out.println("result1="+(1.03-0.42)); System.out.println("result2="+(1.00-9*.10));輸出結果: result2=0.09999999999999998如果希望系統(tǒng)來處理十進制的小數(shù)點,可以使用BigDecimal,如果不考慮小數(shù)的處理,數(shù)值范圍沒有超過9位的那么可以用int來處理,如果不超過18位的,那么可以用long來處理,超過18位那么使用BigDecimal來處理。了解字符串連接的性能字符串連接操作符(+)把多個字符串合并為一個字符串。為連接N個字符串而重復地使用“+”連接,要消耗N的平方級別的時間。這是由于字符串不可變導致的結果。當兩個字符串被連接的時候,它們的內容都要被拷貝。例:如果數(shù)目巨大,這個方法的執(zhí)行時間難以估算。為了提高性能,故改寫如下:假設以上兩種做法,是進行100次的拼接,第二種比第一種要快幾十倍所以,除非性能無關緊要,請用StringBuffer代替String。謹慎地使用本地方法從歷史上看,本地方法主要有三種用途:提供“訪問與平臺相關的設施”的能力提供訪問老式代碼庫的能力實現(xiàn)性能關鍵的局部,提高系統(tǒng)性能。本地方法是有容易產生平安隱患,而且也是不可移植的。同時,在進入和退出本地代碼的時候,要需要較高的固定開銷,如果本地代碼制作少量工作的話,還可能會降低性能。所以,盡量使用Java自身提供的方法來代替本地方法〔如用Java提供的新功能來代替以前只有C語言能實現(xiàn)的功能〕,這樣可以使系統(tǒng)變得更加平安,系統(tǒng)可移植性更高,也使代碼變得更加容易閱讀,如果一定要使用本地方法,請加強測試,并盡可能的少用。謹慎地進行優(yōu)化與優(yōu)化相關的格言:很多計算上的過失都被歸咎于效率原因,不是其他的原因——甚至包括盲目的做傻事。 ——WilliamA.Wulf(美國工程院院長、弗吉尼亞大學計算機科學AT&T教授)不要去計較一些小的效率上的得失,在97%的情況下,不成熟的優(yōu)化才是一切問題的根源。 ——DonaldE.Knuth(經典巨著《計算機程序設計的藝術》的作者)做優(yōu)化時,要遵守兩條原那么:不要做優(yōu)化(僅對專家)還是不要做優(yōu)化——也就是說:在你還沒有絕對清晰的優(yōu)化方案之前,請不要優(yōu)化(面向數(shù)據(jù)結構的軟件設計方法的創(chuàng)造者)上面三個格言比Java的出現(xiàn)早了20年。 但是講述了一個深刻的道理:優(yōu)化更容易帶來傷害,而不是好處,特別是不成熟的優(yōu)化。努力寫好的程序而不是快的程序。應該在設計階段就考慮好的結構,性能的優(yōu)化可以在完成程序之后,當然不是指編寫程序額時候忽略性能問題。
如果一個系統(tǒng)有了清晰、簡明、結構良好的實現(xiàn),請謹慎對其進行優(yōu)化,因為80%的性能問題存在于20%的代碼中,找出影響性能的代碼才是問題的關鍵。異常
只針對異常的情況下才使用異常異常應該只用于異常的情況下;它們永遠不應該用于正常的控制流對可恢復的情況使用受檢異常,對編程錯誤使用運行時異常Java提供了三種可拋出結構:受檢異常、運行時異常和錯誤對可恢復的情況使用已檢查異常,對程序錯使用運行時異常。例如:某個對象在數(shù)據(jù)庫中已經存在,就屬于可恢復的異常——不能再參加那個對象了,如果使用關鍵字約束的話數(shù)據(jù)庫連接錯,就屬于不可恢復的異常,你的程序不可能對它做任何處只能捕捉它。防止不必要的使用受檢的異常
盡量使用標準的異常專家級程序與缺乏經驗程序員一個最主要的區(qū)分是,專家追求高度的代碼重用,并且通常也能實現(xiàn)這樣的代碼重用。代碼重用是值的提倡的,這是條通用的規(guī)那么,異常也不例外。重用異常的好處有三:它使你的API更加易于學習和使用,因為它與程序員原來已經熟悉的習慣用法是一致的。對于用到這些API的程序而言,它們的可讀性更好,因為它們不會充滿著程序員不熟悉的異常。異常類越少,意味著內存占用越小,并且裝載這些類的時間開銷越小。Java平臺庫中迄今為止最常用的異常如下:IllegalArgumentException 不合法的參數(shù)異常IllegalStateException 在不合理或不正確時間內喚醒一方法時出現(xiàn)的異?!踩绯跏蓟磺‘敗砃ullPointerException 空指針異常IndexOutOfBoundsException 下標越界ConcurrentModificationException 在禁止并發(fā)修改的情況下,對象檢測到并發(fā)修改UnsupportedOperationException 對象不支持客戶請求的方法選擇重用哪個異常并沒有唯一的答案,根據(jù)具體情況來選擇。其他的異常也可以使用,只要確保拋出異常的條件與要求一致即可。努力使失敗保持原子性一般而言,一個失敗的方法調用應該使對象保持“它在被調用之前的狀態(tài)”,具有這種屬性的方法被稱為具有失敗原子性。有幾種方法可以獲得這種效果:使用非可變對象在可變對象上的操作,應在執(zhí)行前檢查參數(shù)的有效性,這樣正式操作之前,如果有錯誤,立馬排除異常寫一段恢復代碼,在執(zhí)行失敗的情況下,回滾到操作開始之前的狀態(tài)〔不常用〕在對象的一份臨時拷貝上執(zhí)行操作,當完成之后,再把臨時拷貝中的結果復制給原來的對象,如Collections.sort在執(zhí)行排序之前,先把它的輸入轉儲到一個數(shù)組中,這樣既能降低內循環(huán)的開銷,又能保證在排序失敗的時候,輸入列表保持原樣。注意:在有些場合下,如果實際失敗原子性開銷與復雜性比較大,那么要考慮是否需要實現(xiàn)。不要忽略異常要忽略一個異常非常容易,只需要將方法調用通過try語句包圍起來,并包含一個空的catch塊,空catch塊會使異常達不到應有的目的除非有特殊的需求,否那么不要吃掉異常,至少在catch中包含一條說明,用以解釋忽略這個異常的原因。否那么,就是去了異常本來的意義。就算是簡單地將一個未被檢查的異常傳播到外界也至少會使程序迅速地失敗,從而保存了有助于調試該失敗條件信息,比異常被忽略后的一個不可預測的時刻程序失敗這種情況要強。并發(fā)
同步訪問共享的可變數(shù)據(jù)關鍵字synchronized可以保證在同一時刻,只有一個線程可以執(zhí)行某一個方法,或者某一個代碼塊一般認為同步就是一種互斥的方式,不是很全面。同步的意義:同步不僅可以阻止一個線程看到對象處于不一致的狀態(tài)中,它還可以保證通過一系列看似順序執(zhí)行的狀態(tài)轉變序列,對象從一種一致的狀態(tài)變遷到另外一種一致的狀態(tài)。每一個線程進入到一個被同步的方法或是代碼塊的時候,它會看到由同一個鎖控制的以前所有狀態(tài)轉變的結果。當線程退出了這個被同步的區(qū)域之后,任何線程在進入到由這同一把鎖同步的區(qū)域時,它就可以看到由前面那個線程帶來的狀態(tài)轉變〔如果有狀態(tài)轉變的話〕。也就是代碼是固定的,變量的地址,或是值變量也是固定的,不同的線程會造成數(shù)據(jù)被修改的情況,第2個線程進入就會看到被修改的內存值域。Java語言保證讀或者寫一個變量是原子的,除非這個變量類型為long或是double.也就是說,讀入一個非long或double類型的變量,可以保證返回值一定是某個線程保存在該變量中的,即使多個線程在沒有同步的情況下并發(fā)修改這個變量,也是如此。有些人說,為了提高性能,在讀或寫原子數(shù)據(jù)的時候,你應該防止使用同步。其實這個建議是非常危險而且是錯誤的。雖然原子性保證了一個線程在讀取原子數(shù)據(jù)的時候,不會看到一個隨機的數(shù)值,但是它并不保證一個線程寫入的值對于另外一個線程是可見的:為了在線程之間可靠的通信,以及為了互斥訪問,同步是需要的。同步訪問共享的可變數(shù)據(jù)〔續(xù)〕簡而言之:無論任何時候當多個線程共享可變數(shù)據(jù)的時候,每個讀或寫數(shù)據(jù)的線程必須執(zhí)行同步。如果沒有同步,就無法保證一個線程所做的修改可以被另一個線程獲知。而且這樣的錯誤,是很難調試和重現(xiàn)的,因為線程調試是很麻煩的。他們是高度依賴JVM和操作系統(tǒng)硬件平臺。防止過度使用同步同步可以給我們在實際開發(fā)中帶來很多的好處,合理的使用同步,將會更好的處理多線程及并發(fā)時數(shù)據(jù)的共享和一致性。但是,一句情況的不同,過度的使用同步可能會導致性能減低、死鎖、甚至不確定的行為。為了防止活性失敗和平安性失敗,在一個被同步的方法或者代碼塊中,永遠不要放棄對客戶端的控制。換句話說,在一個被同步的區(qū)域內部,不要調用設計成被覆蓋的方法,或者是由客戶端以函數(shù)的形式提供的方法。從包含該同步區(qū)域的類的角度來看,這樣的方法時外來的。這個類不知道該方法會做什么事情,也無法控制它。根據(jù)外來方法的作用,從同步區(qū)域中調用它會導致異常,死鎖或者數(shù)據(jù)損壞。
不要依賴于線程調度器當有多個線程可以運行時,由線程調度器決定哪些線程將會運行,以及運行多長時間。任何一個合理的操作系統(tǒng)〔JVM〕在做出這樣的決定時,都會努力做到某種公正性,但是對于不同的JVM,其策略是不同的。一個實現(xiàn)良好的多線程程序不應該依賴此策略的細節(jié)。不能讓應用程序的正確性依賴于線程調度器。斗那么,結果得到的應用程序既不健壯也不具有可移植性。作為一個推論,不要依賴Thread.yield或者線程優(yōu)先級。這些設施都只是影響到調度器,它們可以被用來提高一個已經能夠正常工作的系統(tǒng)的效勞質量,但永遠不應用來“修整”一個原本并不能工作的程序。編寫健壯、響應良好的、可移植的多線程程序的最好方法是,盡可能確保在任何給定時刻只有少量的可運行線程。這種方法采用的主要技術是,讓每個線程做少量的工作,然后使用Object.wait等待某個條件發(fā)生,或者使用Thread.sleep睡眠一段時間。防止使用線程組除了線程、鎖和監(jiān)視器之外,線程系統(tǒng)還提供了一個根本的抽象,即
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五版高新技術企業(yè)研發(fā)項目采購合同2篇
- 二零二五年度高校與公益組織合作辦學合同3篇
- 二零二五版家庭健康養(yǎng)生及食療服務合同3篇
- 二零二五年度生態(tài)雞養(yǎng)殖基地購銷合同標準版3篇
- 二零二五版桉樹生物質能源開發(fā)合同2篇
- 二零二五年房地產銷售代理合同中止及終止協(xié)議6篇
- 二零二五版智能倉儲貨物承包運輸一體化合同3篇
- 二零二五年智能空調銷售及綠色環(huán)保安裝合同樣本3篇
- 二零二五年度車庫產權買賣及物業(yè)服務合同范本3篇
- 二零二五年文化藝術品油漆保護修復合同3篇
- 春節(jié)文化常識單選題100道及答案
- 24年追覓在線測評28題及答案
- TGDNAS 043-2024 成人靜脈中等長度導管置管技術
- 《陸上風電場工程概算定額》NBT 31010-2019
- FZ∕T 63006-2019 松緊帶
- 罐區(qū)自動化系統(tǒng)總體方案(31頁)ppt課件
- BIQS評分表模板
- 工程建設項目內外關系協(xié)調措施
- 招投標法考試試題及答案
- 皮帶輸送機工程施工電氣安裝措施要點
- 藥房(冰柜)溫濕度表
評論
0/150
提交評論