Java開發(fā)手冊-嵩山版_第1頁
Java開發(fā)手冊-嵩山版_第2頁
Java開發(fā)手冊-嵩山版_第3頁
Java開發(fā)手冊-嵩山版_第4頁
Java開發(fā)手冊-嵩山版_第5頁
已閱讀5頁,還剩116頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

秉持“圖勝于表,表勝于言”的理念,深入淺出地將計(jì)算機(jī)基礎(chǔ)、面向 11 12 17 20 24 25 27 29 29 30 32 35 37 38 38 39 41 42 44 44 45 46 48 51 53 54反例:RIBENGUIZI/Asan/blackList/whiteList/正例:ForceCode/UserDO/HtmlDTO/XmlService/TcpUdpDeal反例:forcecode/UserDo/HTMLDto/XMLService/TCPUDPDeal/正例:localValue/getHttpMes正例:MAX_STOCK_COUNT/CACHE_EXPIRE框架結(jié)構(gòu))法內(nèi)的不同代碼塊中同名也是合法的,這些情況都要避免。對于非//非setter/getter的參數(shù)名}}}//不允許與父類的成員變量名稱相同}正例:startTime/workQueue/nameList/TERMINATED_THR反例:startedAt/QueueOfWork/listName/COUNT_TERMINATED_說明:將設(shè)計(jì)模式體現(xiàn)在名字中,有利于閱讀者快速理解架構(gòu)設(shè)計(jì)理性,并加上有效的Javadoc注釋。盡量不要在17.接口和實(shí)現(xiàn)類的命名有兩套規(guī)則:反例:反例:易懂變量也要統(tǒng)一定義成應(yīng)用內(nèi)共享常量,兩位工程師在兩個類中分別定義了“YES”的變量:說明:如果存在名稱之外的延伸屬性應(yīng)使用enum類型,下面正例中的數(shù)字就是延伸信息,表示一年中的正例:SPRING(1),SUMMER(2),AUTUMN(3),WI}}1.【強(qiáng)制】如果是大括號內(nèi)為空,則簡潔地寫成{}即可,大括號中間無需換行和空格:(}//左大括號前加空格且不換行;左大括號后換行System.out.println(//在右大括號后直接結(jié)束,則必須換行}正例://這是示例注釋,請注意在雙斜線之后有一個空格正例:8.【強(qiáng)制】單行字符數(shù)限制不超過120個,超出需要換行,換行時遵循如下原則:正例:sb.append("yang").append("h.append("chen")...反例:sb.append("you").append("are").//參數(shù)很多的方法調(diào)用可能超過120說明:除注釋之外的方法簽名、左右大括號、方法內(nèi)代碼、空行、回車及任何不可見字符的總行數(shù)不正例:說明:增加sb這個變量,如果需要對齊,則給one、two、three都要增加幾個空格,在變量比較多的情說明:可變參數(shù)必須放置在參數(shù)列表的最后。(建議開發(fā)者盡量不用可變參數(shù)編程)說明:.URLDecoder中的正例:"test".equals(ob反例:object.equals("te說明:推薦使用JDK7引入的工具類java.util.Objects#7.【強(qiáng)制】所有整型包裝類對象之間值的比較,全部使用equ說明:浮點(diǎn)數(shù)采用“尾數(shù)+階碼”的編碼方式,類似于科學(xué)計(jì)數(shù)法的“有效數(shù)字+指數(shù)”的表示方式。反例://但事實(shí)上a==b的結(jié)果為false}}正例:}}說明:BigDecimal(double)存在精度損失風(fēng)險,在精確計(jì)算或值比較的場景中可能會導(dǎo)致業(yè)務(wù)13.關(guān)于基本數(shù)據(jù)類型與包裝數(shù)據(jù)類型的使用標(biāo)準(zhǔn)如下:說明:框架在調(diào)用屬性xxx的提取方法時,說明:System.out.println(ar說明:公有方法是類的調(diào)用者和維護(hù)者最關(guān)心的方法,首屏展示最好;保護(hù)方法雖然只是子類關(guān)能是“模板設(shè)計(jì)模式”下的核心方法;而私有方法外部一般不需要特別關(guān)心,是一個黑盒實(shí)現(xiàn);因?yàn)槌休d反例:}}反例:}24.【推薦】final可以聲明類、成員變量、方法、以26.【推薦】類成員與方法訪問控制從嚴(yán):說明:任何類、方法、參數(shù)、變量,嚴(yán)控訪問范圍。過于寬泛的訪問范圍,不利于模塊解耦。思考:得手心冒點(diǎn)汗嗎?變量像自己的小孩,盡量在自己的視線內(nèi),變量作用域太大,無限制的到處跑,那么你正例:表示日期和時間的格式如下所示:3.【強(qiáng)制】獲取當(dāng)前毫秒數(shù):System.反例:java.util.Date.after(Date)進(jìn)行時間比較時,當(dāng)入?yún)⑹莏ava.sql.Timestamp時,會觸發(fā)JDK5.【強(qiáng)制】不要在程序中寫死一年為36正例://獲取今年的天數(shù)//獲取指定某年的天數(shù)反例:calendar.add(Calendar.DAT正例:System.out.println("no}3.【強(qiáng)制】在使用java.util.stream.Collectors類的toMap()方法轉(zhuǎn)為M說明:參數(shù)mergeFunction的作用是當(dāng)出正例://生成的map集合中只有一個鍵值對:{ver反例:.collect(Collectors.4.【強(qiáng)制】在使用java.util.stream.Collectors類的toMap()方法轉(zhuǎn)為Map集合時,一定要注說明:在java.util.HashMap的merge方法里會進(jìn)行如下的判斷:反例:6.【強(qiáng)制】使用Map的方法keySet()/values()/entrySet()反例:如果查詢無結(jié)果,返回Collections.emptyList()空集合對象,調(diào)用方一旦會觸發(fā)UnsupportedOperationE反例:直接使用toArray無參方法存在問題,此方法返回值只能是Obj正例:11.【強(qiáng)制】使用工具類Arrays.asList而<?superT>不能使用get方法,兩者在接口調(diào)用賦值的場景中容易出錯。正例:}反例:}反例:下例中沒有處理相等的情況,交換兩個對象判斷結(jié)果并不互反,不符合第一個條件,在實(shí)際正例://全省略方式resize()方法總共會調(diào)用8次,反復(fù)重建哈希表和數(shù)據(jù)遷移。當(dāng)放置的集合元素個數(shù)達(dá)千萬級時會影響程序ValuewhatFeatureOfGroup//定義線程組名稱,在利用jstack來排查問題時,非常有幫助UserThreadFactory(StringwhatFeatureOfGrou}System.out.println(t}4.【強(qiáng)制】線程池不允許使用Executors去創(chuàng)建,而是通過ThreadPoolExe正例:注意線程安全,使用DateUtils。亦推薦如下處理:privatestaticfinalThreadLoca6.【強(qiáng)制】必須回收自定義的ThreadLocal變量,尤其在線程池場景下,線程經(jīng)常會被復(fù)用,如果不清理自定義的ThreadLocal變量,可能會影響后續(xù)業(yè)務(wù)邏輯和造成objectThreadLocal.set(useobjectThreadLocal.remov}9.【強(qiáng)制】在使用阻塞等待獲取鎖的方式中,必須在try代碼塊之外,并且在加),}//如果此處拋出異常,則直接執(zhí)行fin//無論加鎖是否成功,finally代碼塊都會執(zhí)行}說明:Lock對象的unlock方法在執(zhí)行),}正例:悲觀鎖遵循一鎖、二判、三更新、四釋放的說明:Random實(shí)例包括java.util.Random的實(shí)16.【推薦】通過雙重檢查鎖(double-checkedlock正例:}}}}說明:這個變量是針對一個線程內(nèi)所有操作共享的,所以設(shè)置為靜態(tài)變量,所有此類實(shí)例共享此靜態(tài)變量,}System.out.println("http://也不是進(jìn)入這里//也不是進(jìn)入這里System.out.println("def}}3.【強(qiáng)制】在if/else/for/while/do說明:以下兩種場景會觸發(fā)類型對齊的拆箱操作:說明:如果并發(fā)控制沒有處理好,容易產(chǎn)生等值判斷被“擊穿”的情況,使用大于或小于的區(qū)間判斷反例:判斷剩余獎品數(shù)量等于0時,終止發(fā)放獎品,但因?yàn)椴l(fā)處理錯誤導(dǎo)致獎品數(shù)}說明:如果非使用if()...elseif()...else...方式表達(dá)System.out.println("本姑娘是外貌協(xié)會的資}System.out.println("貧賤夫妻}System.out.println("銀河有多遠(yuǎn),你就給我}System.out.println("可以先交往一段時}8.【推薦】除常用方法(如getXxx/isXxx)等外,不要在條件判斷中執(zhí)行其它復(fù)雜的語句,將復(fù)正例://偽代碼如下}反例:acquireQueued(addWaiter(Node.EXCLUSIVE),}說明:賦值點(diǎn)類似于人體的穴位,對于代碼的理//條件表達(dá)式中出現(xiàn)賦值操作,容易誤認(rèn)為是sync==fair}獲取數(shù)據(jù)庫連接,進(jìn)行不必要的try-catch操作(這個tr1.【強(qiáng)制】類、類屬性、類方法的注釋必須使用Javadoc規(guī)范,3.【強(qiáng)制】所有的類都必須添加創(chuàng)建者和創(chuàng)建日期。正例:4.【強(qiáng)制】方法內(nèi)部單行注釋,在被注釋語句上方另起一行,說明:代碼與注釋更新不同步,就像路網(wǎng)與導(dǎo)航軟件更新不同步一樣,如果導(dǎo)航軟件嚴(yán)重滯后,反例:12.【參考】特殊注釋標(biāo)記,請注明標(biāo)記人與標(biāo)記時間。注意及說明:2)路徑:每一個API需對應(yīng)一個路徑,表示API具體的請求地址:說明:四個部分的涉眾對象分別是瀏覽器、前端開發(fā)、錯誤排查人員、用戶。其中輸出給用戶的提要求:簡短清晰、提示友好,引導(dǎo)用戶進(jìn)行下一步操作或解釋錯誤原因,提示信息可以包括錯正例:errorCode/errorMessage/assetStatus/menuL反例:ERRORCODE/ERROR_CODE/error_message/e5.【強(qiáng)制】errorMessage是前后端錯誤追蹤機(jī)制的體現(xiàn),可以在前端輸出到type="hidden"6.【強(qiáng)制】對于需要使用超大整數(shù)的場景以說精度損失是一個概率問題。若浮點(diǎn)數(shù)尾數(shù)位與指數(shù)位空間不限,則可以精確表示任何整數(shù),但很不幸,說明:不同瀏覽器對于URL的最大長度限制略有不同,并且對超出最大們使用的面向用戶的服務(wù),應(yīng)該選擇JSON作為通信中使用的標(biāo)準(zhǔn)數(shù)據(jù)交換格式,包括請求和響應(yīng)。此外,3.【強(qiáng)制】velocity調(diào)用POJO類的正例:對于暫時被注釋掉,后續(xù)可能恢復(fù)使用的代碼片斷,在注釋代碼上方,統(tǒng)一規(guī)定使用三個斜杠(///)來說明注釋掉代碼的理由。如:System.out.println("it'sf}說明:錯誤碼想得過于完美和復(fù)雜,就像康熙字典中的生僻字一樣,用詞似乎精準(zhǔn),但是字典不2.【強(qiáng)制】錯誤碼不體現(xiàn)版本號和錯誤等級信息。說明:錯誤碼以不斷追加的方式進(jìn)行兼容。錯誤等級由日志和錯誤碼本身的釋義來3.【強(qiáng)制】全部正常,但不得不填充錯誤碼時返回五個零:00000。4.【強(qiáng)制】錯誤碼為字符串類型,共5位,分成兩個部分:錯誤產(chǎn)生來源+四位數(shù)字編號。6.【強(qiáng)制】錯誤碼使用者避免隨意定義新的錯誤碼。說明:盡可能在原有錯誤碼附表中找到語義相同或者相近的錯誤碼在代碼中使7.【強(qiáng)制】錯誤碼不能直接輸出給用戶作為提示信息使用。是一個有效關(guān)聯(lián)并互相轉(zhuǎn)義的和諧整體,但是請勿互相越俎8.【推薦】錯誤碼之外的業(yè)務(wù)獨(dú)特信息由error_message來說明:英文單詞形式的錯誤碼不利于非英語母語國家(如阿拉伯語、希伯來語、俄羅斯語等)之說明:數(shù)字是一個整體,每位數(shù)字的地位和含義是說明:無法通過預(yù)檢查的異常除外,比如,在解析字符串形式的數(shù)字時,可能存在數(shù)字格式錯誤,不得不反例:try{obj.method();}catch反例:}9.【強(qiáng)制】在調(diào)用RPC、二方包、或動態(tài)生成類的相關(guān)方法時,捕捉異說明:通過反射機(jī)制來調(diào)用方法,如果找不到方法,拋出NoSuc碼編譯期是正確的,但在代碼運(yùn)行期時,會拋出NoSuc說明:本手冊明確防止NPE是調(diào)用者的責(zé)任。即使被調(diào)各個類的日志處理方式統(tǒng)一。importorg.slf4j.Loggimportmons.loggiimportmons.logging.Log2.【強(qiáng)制】所有日志文件至少保存15天,因?yàn)橛行┊惓>弋?dāng)天日志,以“應(yīng)用名.log”來保存,保存在/home/admin/應(yīng)用名/logs/目錄4.【強(qiáng)制】應(yīng)用中的擴(kuò)展日志(如打點(diǎn)、臨時監(jiān)控、訪問日志等)命名方式:說明:因?yàn)镾tring字符串的拼接會使用}說明:標(biāo)準(zhǔn)日志輸出與標(biāo)準(zhǔn)錯誤輸出文件每次Jboss重正例:logger.error("inputParams:{}anderrorMessage:{}",各類參數(shù)或者對象toString(),e.getMessage(),e);warn來記錄剛上線時的業(yè)務(wù)行為信息,一定要注意日志輸出量的說明:大量地輸出無效日志,不利于系統(tǒng)性能提升,也不利于快速定位錯誤點(diǎn)。記錄日志時請思考:這些測試中不準(zhǔn)使用System.out來進(jìn)行人肉驗(yàn)證,必須使用assert來說明:單元測試通常會被放到持續(xù)集成中,每次有代碼checkin時說明:只有測試粒度小才能在出錯時盡快定位到出錯位置。單測不負(fù)責(zé)檢查跨類或者跨系統(tǒng)的交互邏輯,),15.【參考】為了更方便地進(jìn)行單元測試,說明:忽略參數(shù)校驗(yàn)可能導(dǎo)致:Java代碼用正則來驗(yàn)證客戶端的輸入,有些正則寫法驗(yàn)證普通用戶輸入沒有問題說明:如注冊時發(fā)送驗(yàn)證碼到手機(jī),如果沒有限制次數(shù)和頻率,那么可以利用此功能騷擾到其它說明:在存儲的時候,float和double都存在精度損失的9.【強(qiáng)制】表必備三字段:id,create_time,upd正例:alipay_task/force_project/trade_c13.【推薦】字段允許適當(dāng)冗余,以提高查詢性能,但必須考慮數(shù)據(jù)一人1龜248說明:不要以為唯一索引影響了insert速度,這個速度損耗可以忽略,但提高查找速2.【強(qiáng)制】超過三個表禁止join。需要join的字段,數(shù)據(jù)類型保持絕對一致;3.【強(qiáng)制】在varchar字段上建立索引時,必須指定索offset特別大的時候,效率就非常的低下,要么控正例:先快速定位需要獲取的id段,然后說明:),說明:(概念解釋)學(xué)生表中的student_低并發(fā),不適合分布式、高并發(fā)集群;級聯(lián)更新是強(qiáng)阻塞,存在數(shù)據(jù)庫更新風(fēng)暴的風(fēng)險;外鍵影響說明:對多表進(jìn)行查詢記錄、更新記錄、刪除記錄時,如果對操作列沒有限定表的別名(或),正例:selectfromtable_firstast1,table_secondast2wheret1.id=t2.id;反例:在某業(yè)務(wù)中,由于多表關(guān)聯(lián)查詢語句沒有加表的別名(或表名)的限制,正常運(yùn)行兩年后,正例:selectfromtable_firstast1,table_secondast2wheret1.id=t2.id;說明:3.【強(qiáng)制】不要用resultClass當(dāng)返回參數(shù),即使所正例:?終端顯示層:各個端的模板渲染并執(zhí)行?Web層:主要是對訪問控制進(jìn)行轉(zhuǎn)發(fā),各類基本參數(shù)校驗(yàn)?外部數(shù)據(jù)接口:外部(應(yīng)用)數(shù)據(jù)存儲服務(wù)提供的接口,多見于數(shù)據(jù)遷2.【參考】(分層異常處理規(guī)約)在DAO層,產(chǎn)生的異常類型單獨(dú)部署,則采用與Service一3.【參考】分層領(lǐng)域模型規(guī)約:正例:com.taobao.jstorm或com.alibab正例:dubbo-client/fastjson-api/jstorm-tool2.【強(qiáng)制】二方庫版本號命名方式:主版本號.次版本號.修訂號3.【強(qiáng)制】線上應(yīng)用不要依賴SNAPSHOT版本(安全包除外正式發(fā)布的類庫必須先去中央倉4.【強(qiáng)制】二方庫的新增或升級,保持除功能點(diǎn)之外的其它jar包仲裁結(jié)果不變。如果有改變,說明:在升級時,進(jìn)行dependency:resolve前后信息比對,如dependency:tree命令,找出差異點(diǎn),進(jìn)行<exclude>排除jar包。6.【強(qiáng)制】依賴于一個二方庫群時,必須定義一個統(tǒng)Version。9.【推薦】所有pom文件中的依賴聲明放在<dependencies>語句說明:<dependencyManagement>里只是聲明版本,并不說明:不穩(wěn)定指的是提供方無法做到向下兼容,在編譯階段正常,但在運(yùn)行時產(chǎn)生異常,因此,12.【參考】為避免應(yīng)用二方庫的依賴沖突問題,二方庫1.【推薦】高并發(fā)服務(wù)器建議調(diào)小TCP協(xié)議的time_wait超時時間。說明:操作系統(tǒng)默認(rèn)240秒后,才會關(guān)閉處于time_wait狀態(tài)的連接,在高并發(fā)訪問下,服務(wù)器端會因?yàn)樘幱趖ime_wait的連接數(shù)太多,可能正例:在linux服務(wù)器上請通過變更/etc/sysctl):toomanyfiles”錯誤,導(dǎo)致新的連接無法建立務(wù)器的內(nèi)存數(shù)量相關(guān))。說明:OOM的發(fā)生是有概率的,甚至相隔數(shù)月才出現(xiàn)一例,出錯時的堆內(nèi)信息對解決問統(tǒng)平滑過渡而陡然增加,所以,存儲方案和數(shù)據(jù)結(jié)構(gòu)需要認(rèn)真地進(jìn)行設(shè)計(jì)和評審,

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論