書面學(xué)習(xí)-1.初期阿里巴巴java開發(fā)手冊_第1頁
書面學(xué)習(xí)-1.初期阿里巴巴java開發(fā)手冊_第2頁
書面學(xué)習(xí)-1.初期阿里巴巴java開發(fā)手冊_第3頁
書面學(xué)習(xí)-1.初期阿里巴巴java開發(fā)手冊_第4頁
書面學(xué)習(xí)-1.初期阿里巴巴java開發(fā)手冊_第5頁
已閱讀5頁,還剩27頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

Java開發(fā)手(一)命名規(guī)【強制】代碼中 反例:_name/ name/$Object/name_/name$/Object$【強制】代碼中 名嚴(yán)禁使用拼音與英文混合的方式,更不允許直接使用中文的方式。拼以易。純方式也要免用。反例:DaZhePromotion[打折]/ fenByName()[評分]/int某變量=正例:alibaba /youku/hangzhou等國際通用的名稱,可視同英文的相關(guān)命名)DO/BO/DTO/VO等。正例:MarcoPoloUserDOXmlServiceTcpUdpDeal反例:macroPoloUserDoXMLServiceTCPUDPDeal正例:localValuegetHttpMessage()正例:MAX_STOCK_COUNT反例: 命名以它要測試的類的名稱開始,以Test結(jié)尾。【強制】中括號是數(shù)組類型的一部分,數(shù)組定義如下:String反例:使用Stringargs[]的方式來定義【強制】POJO類中布爾類型的變量,都不要加is,否則部分框架解析會引起序列化錯誤。spring的框架結(jié)構(gòu)) 正例:publicclassOrderFactory;publicclassLoginProxy;publicclassResourceObserver;【推薦】接口類中的方法和屬性不要加任何修飾符號(public也不要加),保持代碼的簡潔性,并加上有效的Javadoc注釋。盡量不要在接口里定義變量,如果一定要定義變量,肯定是正例:接口方法簽名:void接口基礎(chǔ)常量表示:StringCOMPANY反例:接口方法定義 void接 【強制】對于Service和DAO類,基于SOA的理念, 的實現(xiàn)類用Impl的后綴與接口區(qū)別。 Translator實現(xiàn)Translatable。【參考】枚舉類名建議帶上Enum后綴,枚舉成員名稱需要全大寫,單詞間用下劃線隔開。正例:枚舉名字:DealStatusEnum,成員名稱:SUCCESSUNKOWN_REASONService/DAO的方法用save(推薦)或insert做前綴。6)修改的方法用update做前綴。POJO是DO/DTO/BO/VO的統(tǒng)稱 命名成xxxPOJO(二)常量定 反例:Stringkey="Id# cache.put(key, ,造成誤說明:Longa2l21Long 相關(guān)的常量放在類:CacheConsts下;系統(tǒng)配置相關(guān)的常量放在類:ConfigConsts下。 跨應(yīng)用共享常量:放置在二方庫中,通常是client.jar中的 下 A中:publicstaticfinalStringYES類B中:publicstaticfinalStringYES="y"; 類內(nèi)共享常量:直接在類privatestaticfinal定義使用Enum類,下面正例中的數(shù)字就是延伸信息,表示星期幾。SATURDAY(6),SUNDAY(7);}(三)格式規(guī);格。詳見第5條下方正例提【強制】 等保留字與左右括號之間都必須加空格說明:運算符包括賦值運算符=、邏輯運算符&&、加減乘除符號、三目運行符等?!緩娭啤靠s進(jìn)采用4個空格 使用tab字符Usetabcharactereclipseinsertspacesfortabs。(1-5點Stringsay= intflag=if(flag=={}if(flag=={}else}}StringBuffersb=new//超過120個字符的情況下,換行縮進(jìn)4個空格,并且方法StringBuffersb=new//超過120個字符的情況下,不要在括號前換//參數(shù)很多的方法調(diào)用可能超過120個字符,不要在逗號前換,【強制】IDEtextfileencodingUTF-8IDEUnix格式,不要使用windows格式。inta=3;longb=4L;floatc=StringBuffersb=new(四OOP本,直接用類名來即可。反例:getObject()與get0bject()的問題。一個是字母的O,一個是數(shù)字的0,加@Override【強制】相同參數(shù)類型,相同業(yè)務(wù)含義,才可以使用Java的可變參數(shù),避免使用Object。說明:可變參數(shù)必須放置在參數(shù)列表的最后。(提倡盡量不用可變參數(shù)編程)正例:publicUsergetUsers(StringtypeInteger【強制】對外的接口簽名,原則上不允許修改方法簽名,避免對接口調(diào)用方產(chǎn)生影響。接口過時必須加@Deprecated注解,并清晰地說明采用的新接口或者新服務(wù)是什么。該使參數(shù)decode(StringsourceStringencode)。接口提供方既然明確是過時接口,正例:反例:【強制】所有的相同類型的包裝類對象之間值的比較,全部使用equals方法比較。說Integervar=?在-128127之間的賦值,Integer對象是在IntegerCache.cache產(chǎn)生,會復(fù)用已有對象,這個區(qū)間內(nèi)的Integer值可以直接使用==進(jìn)行使用equals方法進(jìn)行判斷。nullNPE風(fēng)險。數(shù)據(jù)類型的null值,能夠表示額外的信息,如:調(diào)用失敗,異常退出。【強制】定義DO/DTO/VO等POJO類時,不要設(shè)定任何屬性默認(rèn)值反例:POJO類的gmtCreate默認(rèn)值為newDate();但是這個屬性在數(shù)據(jù)提取時并沒有置入具果完全不兼容升級,避免反序列化,那么請修改serialVersionUID值。init【強制】POJO類必須寫toString方法。使用IDE的中工具:source>generate時,如果繼承了另一個POJO類,注 面加一下super.toString 內(nèi)容的檢查,否則會有拋IndexOutOfBoundsException的風(fēng)險。Stringstr=String[]ary=//預(yù)期大于3,結(jié)果是3黑盒實現(xiàn);因為方法信息價值較低,所有ServiceDAOgetter/setter方法放在類體最【推薦】setter方法中,參數(shù)名稱與類成員變量名稱一致,this.成員名=參數(shù)名getter/setter方法中,盡量不要增加業(yè)務(wù)邏輯,增加排查問題的難度。publicIntegergetData(){if(true){returndata+}elsereturndata-}}Stringstr="start";for(inti=0;i<100;i++){str=str+ } 5)static成員變量如果僅在本類使用,必須是private。6)若是static成員變量,必須考慮是否為final。 如果是一個private的方法,想刪除就刪除,可是一個public的Service方法,或者一個public的成員變量,刪除一下,不得手心冒點汗嗎?變量像自己的小孩,盡量在自己的視線 (五)集合處正例:String重寫了hashCodeequalsString對象作為key來使用。異常:java.util.RandomAccessSubListcannotbecasttojava.util.ArrayList;說明:subList返回的是ArrayList的 類SubList,并不是ArrayList,而是ArrayList的一個視圖,對于SubList子列表的所有操作最終會反映到原列表上。加、刪除均產(chǎn)生ConcurrentModificationException異常。一樣的數(shù)組,大小就是list.size()。類型數(shù)組將出現(xiàn)ClassCastException錯誤。List<String>list=newArrayList<String>(2);String[]array=newString[list.size()];array=list.toArray(array);toArray帶參方法,入?yún)⒎峙涞臄?shù)組空間不夠大時,toArray方法將重新分配null,其它數(shù)組元素保持原值,因此最好將方法入?yún)?shù)組大小定義與集合元素法,它的add/remove/clear方拋出UnsupportedOperationException異常。String[]str=newString[]{"a","b"};Listlist=Arrays.asList(str);第一種情況 運行時異常";【強制】泛型通配符extendsT>add方說明:蘋果裝箱后返回一個extendsFruits>對象,此對象就不能往里加任何水果,包括【強制】不要在foreach循環(huán)里進(jìn)行元remove/add操作。remove元素請使用List<String>a=newArrayList<String>();for(Stringtemp:}}Iterator<String>it=a.iterator();Stringtempit.next();}}Collections.sort會報IllegalArgumentException異常。傳遞性:x>y,y>z,則x>z對稱性:x=y,x,z比較結(jié)y,znewComparator<Student>(){returno1.getId()>o2.getId()?1:-}}說明:keySet其實是遍歷了2次,一次是轉(zhuǎn)為Iterator對象,另一次是從hashMap中取出key所對應(yīng)的value。而entrySet只是遍歷了一次就把key和value都放到了entry中,效率更高。如果是JDK8,使用Map.foreach方法。Set集合對象;entrySet()K-V11MapSet集合對象;entrySet()K-V11Map類集合K/V能不null值的情況,如下表 (六)并發(fā)處說不允許為不允許為線程安不允許為不允許為分段鎖技不允許為允許為線程不安允許為允許為線程不安{publicTimerTaskThread(){super.setName("TimerTaskThread");...}【強制】線程池不允許使用Executors去創(chuàng)建,而是通過ThreadPoolExecutor的方式,這樣允許的請求隊列長度為Integer.MAX_VALUE,可能會堆積大量的請求,從而導(dǎo)致OOM允許的創(chuàng)建線程數(shù)量為Integer.MAX_VALUE,可能會創(chuàng)建大量的線程,從而導(dǎo)致OOMprotectedDateFormatinitialValue()returnnewSimpleDateFormat("yyyy-MM-}說明:如果JDK8的應(yīng)用,可以使InstantDaocalDateTimeCalendar,DateTimeFormatter代替Simpledateformattersimplebeautifulstrongimmutablethread-safe。也必須是A、B、C,否則可能出現(xiàn)死鎖。數(shù)據(jù)庫層使用樂觀鎖,使用version作為更新依據(jù)。數(shù)不得小于3次?!緩娭啤慷嗑€程并行處理定時任務(wù)時,TimerTimeTask時,只要其中之一沒有捕獲【推薦】使用CountDownLatch進(jìn)行異步轉(zhuǎn)同步操作,每個線程退出前必須調(diào)用countDown方法,線程執(zhí)行代碼注意catch異常,確保countDown方法可以執(zhí)行,避免主線程無法執(zhí)行至countDown方法,直到超時才返回結(jié)果。說明:注意,子線程拋出異常堆棧,不能在主線程try-catchseed【推薦】通過雙重檢查鎖(double-checkedlocking)(在并發(fā)場景)實現(xiàn)延遲初始化的優(yōu)化問題隱患(可參考The"Double-CheckedLockingisBroken"Declaration),推薦問題解決方案中較為簡單一種(適用于JDK5及以上版本),將目標(biāo)屬性 為volatile型。classFooprivateHelperhelper=null;publicHelpergetHelper(){if(helper==null){if(helper==null)helper=new}return}//otherfunctionsand}但是如果多寫,同樣無法解決線程安全問題。如果是count++操作,使用如下類實現(xiàn):AtomicIntegercountnewAtomicIntegercount.addAndGet(1JDK8,推薦使用LongAdder對象,比AtomicLong性能更好(減少樂觀鎖的重試次數(shù))?!緟⒖肌縏hreadLocal無法解決共享對象的更新問題,ThreadLocalstatic(七)控制語【強制】在一switch塊內(nèi),每個case要么通過break/return等來終止,要么注釋說明程下面的形式:if(condition)statements;return}說明:如果非得使用if()...elseif()...else...方式表達(dá)邏輯,【強制】 超過3層,booleanexisted=(file.open(fileName,"w")!=null)&&(...)||(...);if(existed){}if((file.open(fileName,"w")!=null)&&(...)||(...))}對外提供的開放接口,不管是RPC/API/HTTP接口誤不太可能到底層才會問題。一般DAOService層都在同一個應(yīng)用中,部署在同一臺服務(wù)器中,所以DAO的參數(shù)校驗,可以省略。被private只會被自己代碼所調(diào)用的方法,如果能夠確定調(diào)用方法的代碼傳入?yún)?八)注釋規(guī)【強制】類、類屬性、類方法的注釋必須使用Javadoc規(guī)范,使用/**內(nèi)容*/格式,不得//xxx方式說明:在IDE編輯窗口中,Javadoc方式會提示相關(guān)注釋,生成Javadoc可以正確輸出相應(yīng)注釋;在IDE中,工程調(diào)用方法時,不進(jìn)入方法即可懸浮提示方法、參數(shù)、返回值的意義,提高閱異常說明外,還必須該方法做什么事情,實現(xiàn)什么功能。 使用/**/注釋,注意與代碼對齊。反例 連接超時”解釋成“傳輸控制協(xié)議連接超時”,理解反而費腦筋說說的,使其能夠快速自己的工作?!緟⒖肌亢妹?、代碼結(jié)構(gòu)是自解釋的,注釋力求精簡準(zhǔn)確、表達(dá)到位。避免出現(xiàn)注釋的一個:過多過濫的注釋,代碼的邏輯一旦修改,修改注釋是相當(dāng)大的負(fù)擔(dān)。//pu ephantintofridge ephant,fridge);1)待辦事宜(TODO):(標(biāo)記人,標(biāo)記時間,[預(yù)計處理時間表示需要實現(xiàn)但目前還未實現(xiàn)的功能這實際上是一個Javadoc的 目前的Javadoc還沒有實現(xiàn)但已經(jīng)被廣泛使用只能應(yīng)用于類接口和方法(因為它是一個Javadoc (九說明:不要在方法體內(nèi)定義:Patternpattern= 【強制】velocity調(diào)用POJO類的屬性時,建議直接使用屬性名取值即可,模板引擎會自動按規(guī)范調(diào)用POJO的getXxx(),如果是boolean基本數(shù)據(jù)類型變量(boolean命名不需要加is前綴),會自動調(diào)用isXxx()方法?!緩娭啤枯斔徒o頁面的變量必須加$!{var}——中間的感嘆號說明:如果var=null或者不存在,那么${var}會直接顯示在頁面上取到零值,注意除零異常),如果想獲取整數(shù)類型的隨機數(shù),不要將x放大10的若干倍然后取整,直接使用RandomnextIntnextLong方法。System.currentTimeMillis而不是newDate().getTime();說明:如果想獲取更加精確的納秒級時間值,用System.nanoTime()。在JDK8中,針對統(tǒng)計時間等場景,推薦使用Instant類。【推薦】盡量不要在vm中加入變量、邏輯運算符,更不要在vm模板中加入任何復(fù)雜的邏 (一)異常處IndexOutOfBoundsExceptionNullPointerException,這類異常由程序員預(yù)檢查正例:if(objnull)反例:tryobj.methodcatch(NullPointerException【強制】有try塊放到了事務(wù)代碼中,catch異常后,如果需要回滾事務(wù),一定要注意手動回滾說明:如果JDK7,可以使用try-with-resources方式?!緩娭啤坎荒躥inally塊中使用return,finally塊中的return返回后方法結(jié)束執(zhí)行,不會再執(zhí)行try塊中的return語句。說明什么情況下會返回null值。調(diào)用方需要進(jìn)行nullNPE問題。反例:publicintf()returnInteger對象nullNPE級聯(lián)調(diào)用obj.getA().getB().getC();一連串調(diào)用,易產(chǎn)生NPE使用“錯誤碼”;而應(yīng)用推薦異常拋出;跨應(yīng)用間RPC調(diào)用優(yōu)先考慮使用Result方式,封裝isSuccess、“錯誤碼”、“錯誤簡息”?!就扑]】定義時區(qū)分uncheckedchecked異常,避免直接使用RuntimeException拋出,更不允許拋出Exception或者Throwable過的自定義異常,如:DAOException/ServiceException等。【參考】避免出現(xiàn)重復(fù)的代碼(Don’tRepeatYourself)DRY說明:隨意和粘貼代碼,必然會導(dǎo)致代碼的重復(fù),在以后需要修改時,需要修改所有的副privatebooleancheckParam(DTO(二)日志規(guī)【強制】應(yīng)用中不可直接使用日志系統(tǒng)(Log4j、Logback)中的API,而應(yīng)依賴使用日志框架SLF4J中的API,使用門面模式的日志框架,有利于和各個類的日志處理方式統(tǒng)一。importorg.slf4j.Logger;【強制】日志文件推薦至少保存15天,因為有些異常具備以“周” 說明:logger.debug("Processingtradewithididsymbolsymbol);如果日志級別是warn會打但是會執(zhí)行字符串拼symbol是對象,會執(zhí)行toString()方法,浪費了系統(tǒng)資源,執(zhí)行了上述操作,最終日志卻沒有打印。正例:(條件if(logger.isDebugEnabled())logger.debug("Processingtradewithid:"+id+"symbol:"+}正例:(占位符【強制】避免重復(fù)打印日志,浪費磁盤空間,務(wù)必在log4j.xml中設(shè)置additivity=false。正例:<loggername="com..dubbo.config"additivity="false">正例:logger.error(toString_"e.getMessagewarn日志級別來記錄用戶輸入?yún)?shù)錯誤的情況,避免用戶時,無所適要,請不要在此場景打出error級別?!就扑]】謹(jǐn)慎地記錄日志。生產(chǎn)環(huán)境輸出debug日志;info日志;如果使(一)建表規(guī)【強is_xxx的方式命名,數(shù)據(jù)類型是unsigned(1表示是,0表示否)odps建表。說明:任何字段如果為非負(fù)數(shù),必須是unsigned。 【強制】禁用保留字,如desc、range、match、delayed等,請參考 保留字說明:uk_即uniquekey;idx_index的簡稱。 說明:float和double在 的數(shù)據(jù)范圍超過decimal的范圍,建議將數(shù)據(jù)拆成整數(shù)和小數(shù)分開 【強制】varchar是可變長字符串,不預(yù)先分配空間,長度不要超過5000,如果長text,獨立出來一張表,用主鍵來對應(yīng),避免影響其它字段索【強制】表必備三字段:idgmt_creategmt_modifiedgmt_modified的類型均為date_time正例:tiger_task/tiger_reader/mpp_config【推薦】單表行數(shù)超過500萬行或者單表容量超過2GB【參考】合適的字符長度,不但節(jié)約數(shù)據(jù)庫表空間、節(jié)約索引,更重要的是提升檢正例:人的用unsignedtinyint(0-255,人的不會超過255歲);海龜smallint,但如果是的,就必須是int;如果是所有恒星的都加起來,那么就必須使用bigint。(二)索引規(guī)insert速度,這個速度損耗可以忽略,但提高查找速度是明【強制】超過三個表 【強制】在varchar字段上建立索引時,必須指定索引長度,沒必要對全字段建立索引,根據(jù)實說明:索引的長度與區(qū)分度是一對20的索引,區(qū)分orderby的場景,請注意利用索引的有序性。orderby最后的字段是組合索引的一部分,并且放在索引組合順序的最后,避免出現(xiàn)file_sort的情況,影響查詢性能。正例:wherea=?andb=?orderbyc;索引:a_b_c反例:索引中有范圍查找,那么索引有序性無法利用,如:WHEREa>10ORDERBYba_b無法排1111章對應(yīng)的那一頁嗎?瀏覽一下就好,這個就是起到覆蓋索引的作用。效果,用explain的結(jié)果,extra列會出現(xiàn):usingindex。說明:MySQL并不是offset行,而是取offset+N行,然后返回放棄前offset行,返回N行,那當(dāng)offset特別大的時候,效率就非常的低下,要么控制返回的總頁數(shù),要么對超過特定閾值的頁數(shù)進(jìn)行SQL改寫。SELECTa.*FROM1a,selectidfrom1whereLIMIT100000,20bwhere ref指的是使用普通的索引(normalindex)range別比較range還低,與全表掃描是小巫見大巫。andb=?那么即使a的區(qū)分度更高,也必須把b放在索引的最前列。 誤解誤認(rèn)為唯一索引一律需要在應(yīng)用層通過“先查后插”方式解(三SQL的標(biāo)準(zhǔn)統(tǒng)計行數(shù)的語法,跟數(shù)據(jù)庫無關(guān),跟NULL和非NULL無關(guān)。說明:count(*)會統(tǒng)計值為NULL的行,而count(列名)不會統(tǒng)計此列為NULL值的col1,col2)如果其中一列全為NULL,那么即使另一列有不同的值,也返回為0。NULL,因此使用sum()時需注意NPE問題。FROMtable;【強制】在代碼中寫分頁查詢邏輯時,若count為0應(yīng)直接返說明:(概念解釋)學(xué)生表中的student_id是主鍵,那么成績表中的student_id則為外鍵。如果更新學(xué)生表中的student_id,同時觸發(fā)成績表中的student_id更新,則為級聯(lián)更新。外庫更新風(fēng)暴的風(fēng)險;外鍵影響數(shù)據(jù)庫的速度?!緩娭啤渴褂眠^程,制在1000個之內(nèi)。SELECTLENGTH("輕松工作")SELECTCHARACTER_LENGTH("輕松工作")如果要使用表情,那么使用utfmb4來進(jìn)行,注意它與utf-8編碼的區(qū)別說明:TRUNCATETABLE在功能上與不帶WHERE子句的DELETE語句相同。(四ORM說明:1)增加查詢分析器解析成本。2)增減字段容易與resultMap配置不一致。 說明:參見定義POJO類以及數(shù)據(jù)庫字段定義規(guī)定,在sql.xml增 ,是必須的 取start,size的子集合,線上因為這個原因曾經(jīng)出現(xiàn)過OOM。sqlmap.xml中引入#start#,#size#Map<String,Object>mapnewHashMap<StringObject>();map.put("start",start);map.put("size",【強制】更新數(shù)據(jù)表記錄時,必須同時更新記錄對應(yīng) gmt_modified字段值為當(dāng)前時間updatetablesetc1=value1,c2=value2,c3=value3SQL時,盡量不要更新無改動的字段,一是易出錯;二是效率低;三是binlog增加?!緟⒖肌?lt;isEqual>中的compareValue是與屬性值對比的常量,一般是數(shù)字,表示相等時帶(一)應(yīng)用分開放接口層:可直接封裝Service接 Web層:主要是 對 平臺封裝的層,預(yù)處理返回結(jié)果及轉(zhuǎn)化異常信息 外部接口或 (分層異常處理規(guī)DAO層,產(chǎn)生的異常類型有很多,無法用細(xì)粒度異常進(jìn)行catch,使用catch(Exceptione)方式,并thrownewDAOException(e),不需要打印日志,信息,相當(dāng)于保護(hù)案發(fā)現(xiàn)場。如果Manager層與Service同機部署,日志方式與DAO層處理DTO(DataTransferObject):

溫馨提示

  • 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

提交評論