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