版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
一、前 二、編程規(guī) OOP規(guī) 三、集合處 四、注釋規(guī) 五、異常日 六、其 此JAVA編程規(guī)范涉及代碼管理、命名規(guī)范、代碼層次、編碼風格、注釋JAVA項目開發(fā)和維護。反例:_namename$Objectname_name$/正例:alibabataobaoyoukuhangzhou等國際通用的名稱,可視同英文。反例:DaZhePromotion[打折]/getPingfenByName()[評分]/int某變量=3UpperCamelCase風格,必須遵從駝峰形式,但以下情形例外:Do/Bo/Dto/Vo/Ao正例:MarcoPoloUserDoXmlServiceTcpUdpDeallocalValuegetHttpMessage(.AbstractBaseTest【強制】中括號是數(shù)組類型的一部分,數(shù)組定義如下:StringStringargs[]【強制】POJOis,否則部分框架解析會反例:定義為基本數(shù)據(jù)類型BooleanisDeleted;的屬性,它的方法也是isDeleted(),RPCdeleted,com.alibaba.open.utilMessageUtils(此spring的框架結(jié)構(gòu))PullCodeFromRemoteRepository。反例:變量inta;的隨意命名方式。正例:publicclassOrderFactory;publicclassLoginProxy;publicclassResourceObserver;(public也不要加Javadoc注釋。盡量不要在接口里定義變量,正例:接口方法簽名:void接口基礎(chǔ)常量表示:StringCOMPANY反例:接口方法定義:publicabstractvoid說明:JDK8中接口允許有默認實現(xiàn),那么這個default方法,是對所有實ServiceDAOSOA的理念,暴露出來的服務(wù)一定是接口,內(nèi)部的實現(xiàn)類用Impl的后綴與接口區(qū)別。正例:CacheServiceImplICacheService是–able的形式)。正例:AbstractTranslatorTranslatable。IICacheService;15【參考】枚舉類名建議帶上Enum后綴,枚舉成員名稱需要全大寫,單ProcessStatusEnumSUCCESS/Service/mapperget獲取多個對象的方法用list獲取統(tǒng)計值的方法用count做前綴。4)插入的方法用save/insert做前綴。5)remove/delete做前綴。6)修改的方法用update做前綴。數(shù)據(jù)對象:xxxDo,xxx數(shù)據(jù)傳輸對象:xxxDto,xxx展示對象:xxxVo,xxxPOJODo/Dto/Bo/VoxxxPOJO反例:Stringkey="Id#taobao_"+tradeId;【強制】longLongLl,小寫容易跟數(shù)字1混淆,造成誤解。說明:Longa2l;21,還是Long型的正例:緩存相關(guān)常量放在類CacheConsts下;系統(tǒng)配置相關(guān)常量放在類ConfigConsts子工程內(nèi)共享常量、包內(nèi)共享常量、類內(nèi)共享常量。client.jarconstant目modulesconstant目別定義了表示“是”的變量:A中:publicstaticfinalStringYESB中:publicstaticfinalStringYESA.YES.equals(B.YES)truefalse,導致線上問題。3)子工程內(nèi)部共享常量:即在當前子工程的constant目錄下。constantprivatestaticfinalpublicEnum{MONDAY(1),TUESDAY(2),WEDNESDAY(3),THURSDAY(4),FRIDAY(5),SATURDAY(6),可,不需要換行;如果是非空代碼塊則:else等代碼則不換行;表示終止的右大括號后必須換也不出現(xiàn)空格。詳見第5條下方正例提示。反例:if空格ab空格【強制】if/for/while/switch/do【強制】任何二目、三目運算符的左右兩邊都需要加一個空格。說明:運算符包括賦值運算符、邏輯運算符&4個空格縮進,禁止使用tabtab1tab4IDEAtab4個空格時,請勿勾選Usetabcharactereclipseinsertspacesfortabs。(涉及1-5點publicstaticvoidmain(String[]args)//縮進4Stringsay=//intflag=//iff與左括號,0與右括if(flag==0){//if(flag==1){//右大括號前換行,右大括號后有else}else{//正例://注釋內(nèi)容,注意在//和注釋內(nèi)容之間有一個空格。120個,超出需要換行,換行時遵循如4個空格,從第三行開始,不再繼續(xù)縮進,參StringBuffersb=new//超過1204StringBuffersb=new//超過120//參數(shù)很多的方法調(diào)用可能超過120method(args1,args2,args3,...,正例:下例中實參的"a",后邊必須要有一個空格。method("a","b","c");【強制】IDE的textfileencoding設(shè)置為UTF-8;IDE中文件的換行符使用Unix格式,不要使用Windows格式。inta=3;longb=4L;floatc=StringBuffersb=new說明:增加sb這個變量,如果需要對齊,則給a、b、c都要增加幾個空OOP無謂增加編譯器解析成本,直接用類名來訪問即可。【強制】所有的覆寫方法,必須加@Override加@Override可以準確判斷是否覆蓋成功。另外,如果在抽象類中對方法簽名進行修改,其實現(xiàn)類會馬上編譯報錯。Java的可變參數(shù),避免使用Object。正例:publicUsergetUsers(StringtypeIntegerids)說明:.URLDecoderdecode(StringencodeStr)這個方法已decode(StringsourceStringencode)。接口提供方既然【強制】Objectequals方法容易拋空指針異常,應使用常量或確定有值的對象來調(diào)用equals。java.util.Objects#equals(JDK7引入的工具類equals方Integervar=?在-128127范圍內(nèi)的賦值,IntegerIntegerCache.cache產(chǎn)生,會復用已有對象,這個區(qū)間內(nèi)的Integer值可以直接使用==會復用已有對象,這是一個大坑,推薦使用equals方法進行判斷。POJO【強制】RPCNPE有NPE風險。反例:比如顯示成交總額漲跌情況,即正負x%,x為基本數(shù)據(jù)類型,調(diào)用的RPC服務(wù),調(diào)用不成功時,返回的是默認值,頁面顯示為0%,這是不合null【強制】定義Do/Dto/Vo等POJO類時,不要設(shè)定任何屬性默認值。反例:POJO類的gmtCreate默認值為newDate();但是這個屬性在數(shù)據(jù)提serialVersionUID字段,避免反序列失敗;如果完全不兼容升級,避免反序列化混亂,那么請修改serialVersionUID值。serialVersionUID放在init方法中?!緩娭啤縋OJOtoStringIDE的中工具:source>generatetoString時,如果繼承了另一個POJO類,注意在前面加一下POJOtoString()方法打印其屬性值,便于排查問題。Stringsplit方法得到的數(shù)組時,需做最后IndexOutOfBoundsException的風Stringstr=String[]ary=//預期大于3,結(jié)果是3按順序放置在一起,便于閱讀,此條規(guī)則優(yōu)先于第15條規(guī)則。>>getter/setter方法。有Service和DAO的getter/setter方法放在類體最后。getter/setter方法中,不要增加業(yè)務(wù)邏輯,增加排查問題的難度。publicIntegergetData(){if(true){returnthis.data+}elsereturnthis.data-StringBuilderappend方newStringBuilderappendtoStringString對象,造成Stringstr=for(inti=0;i<100;i++){str=str+"hello";final不允許被繼承的類,如:String不允許修改引用的域?qū)ο?,如:POJO不允許被重寫的方法,如:POJOsetterfinal描述可以強制重新定義一個變量,方便更好地進行重構(gòu)。Objectclonecloneclone方法實現(xiàn)屬性對象的拷貝。如果不允許外部直接通過new來創(chuàng)建對象,那么構(gòu)造方法必須是publicdefaultstaticprotected。4)staticprivate。5)類static成員變量如果僅在本類使用,必須是private。6)若是static成員變量,必須考慮是否為final。privateprotected思考:如果是一個private的方法,想刪除就刪除,可是一個public的service方法,或者一個public的成員變量,刪除一下,不得手心冒點汗嗎?hashCodeequalsequalshashCodeSethashCodeequals進行判斷,所以Set存儲的對象必須重寫這兩個方法。MaphashCodeequals。說明:String重寫了hashCode和equals方法,所以我們可以非常愉快地Stringkey【強制】ArrayListsubList結(jié)果不可強轉(zhuǎn)成ArrayList,否則會拋出ClassCastException異常,即java.util.RandomAccessSubListcannotbecastto說明:subListArrayListSubListArrayList,ArrayListSubList子列表的所有操作最終會反映到原列【強制】在subList場景中,高度注意對原集合元素個數(shù)的修改,會導ConcurrentModificationException異常?!緩娭啤渴褂眉限D(zhuǎn)數(shù)組的方法,必須使用集合的toArray(T[]array),傳入的是類型完全一樣的數(shù)組,大小就是list.size()。說明:使用toArray帶參方法,入?yún)⒎峙涞臄?shù)組空間不夠大時,toArray方下標為[list.size()]的數(shù)組元素將被置為null,其它數(shù)組元素保持原值,因此最好將方法入?yún)?shù)組大小定義與集合元素個數(shù)一致。List<String>list=newArrayList<String>(2);String[]array=newString[list.size()];array=list.toArray(array);toArrayClassCastException【強制】使用工具類改集合相關(guān)的 法,它 方法會拋UnsupportedOperationException說明:asListArrays內(nèi)部類,并沒有實現(xiàn)集合的修改方法。Arrays.asListString[]str=newString[]{"you","wu"};Listlist=Arrays.asList(str);第一種情況:list.add("yangguanbao");第二種情況:str[0]gujin";list.get(0)addsuperT>getPECS(ProducerExtendsConsumerSuper)原則:第一、頻繁往外讀取內(nèi)容的,適合用<?extendsT>。第二、經(jīng)常往里插入的,適合用<?superT>。foreachremove/addremove元素請使用Iterator方式,如果并發(fā)操作,需要對Iterator對象加鎖。Iterator<String>iterator=list.iterator();while(iterator.hasNext()){Stringitemiterator.next();if(刪除元素的條件){List<String>a=newArrayList<String>();for(Stringitem:list){if("1".equals(item)){成“2”,會是同樣的結(jié)果嗎?【強制】在JDK7版本及以上,Comparator要滿足如下三個條件,不然Arrays.sort,Collections.sort會報IllegalArgumentException異常。x,y的比較結(jié)果和y,xx>y,y>zx>zx=yx,z比較結(jié)果和y,znewComparator<Student>(){publicintcompare(Studento1,Studento2){returno1.getId()>o2.getId()?1:-1;說明:HashMapHashMap(intinitialCapacity)正例:initialCapacity/負載因子1。注意負載因(即默認值)反例:HashMap需要放置1024個元素,由于沒有設(shè)置容量初始大小,隨7次被迫擴大,resizehash表,嚴重影響性entrySetMapKVkeySet方式進說明:keySet2IteratorhashMapkeyvalueentrySetkeyvalueentryJDK8Map.foreach方法。正例:values()返回的是V值集合,是一個list集合對象;keySet()返回的KSet集合對象;entrySet()K-V序性(unsort)和不穩(wěn)定性(unorder)帶來的負面影響。每次遍歷的元素次序是一定的。如:ArrayList是order/unsort;HashMap是unorder/unsort;TreeSet是order/sort。Set避免使用List的contains方法進行遍歷、對比、去重操作。publicclassTimerTaskThreadextendsThread{publicTimerTaskThread(){量同類線程而導致消耗完內(nèi)存或者“過度切換”的問題。Executors說明:ExecutorsFixedThreadPool而導致OOM。CachedThreadPool而導致OOM。SimpleDateFormatstatic變量,如果定義為static,必須加鎖,或者使用DateUtils工具類。DateUtils ThreadLocal<DateFormat>(){protectedDateFormatinitialValue()returnnewSimpleDateFormat("yyyy-MM-JDK8Instant代替DateTimeFormatter代替SimpleDateFormat,官方給出的解釋:simplebeautifulstrongimmutablethread-safeRPC么線程二的加鎖順序也必須是A、B、C,否則可能出現(xiàn)死鎖。version作為更說明:如果每次訪問沖突概率小于20%,推薦使用樂觀鎖,否則使用悲觀鎖。樂觀鎖的重試次數(shù)不得小于3次。【強制】多線程并行處理定時任務(wù)時,Timer運行多個TimeTask時,只要其中之一沒有捕獲拋出的異常,其它任務(wù)便會自動終止運行,使用ScheduledExecutorService則沒有這個問題。CountDownLatch進行異步轉(zhuǎn)同步操作,每個線程退出前countDowncatchcountDown方法被執(zhí)行到,避免主線程無法執(zhí)行至await方法,直到超時才返回結(jié)果。try-catch【推薦】避免Random實例被多線程使用,雖然共享該實例是線程安全的,但會因競爭同一seed導致的性能下降。說明:Random實例包括java.util.Random的實例或者Math.random()的方JDK7APIThreadLocalRandom【推薦】在并發(fā)場景下,通過雙重檢查鎖(double-checkedlocking)實現(xiàn)延遲初始化的優(yōu)化問題隱患(可參考The"Double-CheckedLockingisBroken"Declaration),推薦解決方案中較為簡單一種(適用于JDK5及以上版本),將目標屬性聲明為volatile型。classSingletonprivateHelperhelper=null;publicHelpergetHelper(){if(helper==null)synchronized(this){if(helper==null)helper=newreturn//othermethodsand【參考】volatile解決多線程內(nèi)存不可見問題。對于一寫多讀,是可以count++AtomicIntegercount=newAtomicInteger();count.addAndGet(1);JDK8LongAdderAtomicLong性能更好(減少樂觀鎖的重【參考】HashMapresize時由于高并發(fā)可能出現(xiàn)死鏈,導致CPU飆升,在開發(fā)過程中可以使用其它數(shù)據(jù)結(jié)構(gòu)或加鎖來規(guī)避此風險?!緟⒖肌縏hreadLocal無法解決共享對象的更新問題,ThreadLocal對象建議使用static修飾。這個變量是針對一個線程內(nèi)所有操作共享的,所以設(shè)置為【強制】在一個switch塊內(nèi),每個case要么通過break/return等來終caseswitch塊內(nèi),都必須包含一個default語句并且放在最后,即使它什么代碼也沒有。if/else/for/while/do語句中必須使用大括號。即使只有一行代碼,避免采用單行的編碼方式:if(condition)statements;if-elseif(condition)return//接著寫else的業(yè)務(wù)邏輯代碼if()...elseif()...else...方式表達邏輯,【強制】避免后續(xù)代碼維護困難,請勿超過3層。3if-else的邏輯判斷代碼可以使用衛(wèi)語句、策略模式、狀publicvoidtoday(){if(isBusy()){System.out.println(“changeif(isFree()){System.out.println(“gototravel.”);System.out.println(“stayathometolearnAlibabaJavaCodingGuidelines.”);【推薦】除常用方法(如getXxx/isXxx)等外,不要在條件判斷中執(zhí)行if語句內(nèi)的邏輯相當復雜,閱讀者需要分析條件表達式的最終//finalbooleanexisted=(file.open(fileName,"w")!=null)&&(...)||(...);if(existed){if((file.open(fileName,"w")!=null)&&(...)||(...))如定義對象、變量、獲取數(shù)據(jù)庫連接,進行不必要的try-catch操作(這個try-catch是否可以移至循環(huán)體外)。RPC/API/HTTPDAOService層都在同一個應用中,部署在同一臺服務(wù)器中,所以DAO的參數(shù)校驗,可以省略。private只會被自己代碼所調(diào)用的方法,如果能夠確定調(diào)用方【強制】類、類屬性、類方法的注釋必須使用Javadoc規(guī)范,使用/**內(nèi)容*/格式,不得使用//xxx方式。IDE編輯窗口中,JavadocJavadoc可以正確輸出相應注釋;在IDE中,工程調(diào)用方法時,不進入方法即可懸浮提【強制】所有的抽象方法(包括接口中的方法)Javadoc注釋、方法內(nèi)部多行注釋使用/**/注釋,注意與代碼對齊。反例:“TCP連接超時”解釋成“傳輸控制協(xié)議連接超時”,理解反而費【參考】對于注釋的要求:第一、能夠準確反應設(shè)計思想和代碼邏輯;//putelephantintofridgeput(elephant,fridge);putelephantfridge待辦事宜(TODO):([預計處理時間])要實現(xiàn),但目前還未實現(xiàn)的功能。這實際上是一個Javadoc的標簽,目前的Javadoc還沒有實現(xiàn),但已經(jīng)被廣泛使用。只能應用于類,接口和方法(因為它是一個Javadoc標簽)。在注釋中用FIXME標記某代碼是錯誤的,而且不能工作,需要及時糾正JavaRuntimeException可以通過預先檢查進行規(guī)避,而不應該通過catch來處理,比如:IndexOutOfBoundsException,NullPointerException等等。字時,通過catchNumberFormatException來實現(xiàn)。正例:ifobj!=null)反例:tryobj.methodcatch(NullPointerExceptionetry-catch,這是不負責任的表現(xiàn)。catch時請分定代碼的catch盡可能進行區(qū)分異常類型,再做對應的異常處理。try塊放到了事務(wù)代碼中,catch【強制】finallyJDK7try-with-resources【強制】不能在finally塊中使用return,finally塊中的return返回后方法結(jié)束執(zhí)行,不會再執(zhí)行try塊中的return語句。必須添加注釋充分說明什么情況下會返回null值。調(diào)用方需要進行null判斷防止NPE問題。NPE是調(diào)用者的責任。即使被調(diào)用方法返回空集合null的情況。NPENPE1)返回類型為基本數(shù)據(jù)類型,return包裝數(shù)據(jù)類型的對象時,自動拆箱有可能產(chǎn)生NPE。反例:publicintf(returnInteger對象}nullNPE。2)數(shù)據(jù)庫的查詢結(jié)果可能為null。isNotEmptynull。4)遠程調(diào)用返回對象時,一律要求進行空指針判斷,防止NPE。SessionNPEobj.getA().getB().getC()NPE。正例:使用JDK8的Optional類來防止NPE問題?!就扑]】定義時區(qū)分unchecked/checked異常,避免直接拋出newRuntimeException()ExceptionThrowable,應使用有業(yè)務(wù)含義的自定義異常。推薦業(yè)界已定義過的自定義異常,如:DAOExceptionServiceException等。http/apiRPCResultisSuccess()方法、“錯誤碼”、“錯誤簡RPC方法返回方式使用Result如果不加棧信息,只是new自定義異常,加入自己的理解的error【參考】避免出現(xiàn)重復的代碼(Don’tRepeatYourself)DRY原publicprivatebooleancheckParam(DTOdto)【強制】應用中不可直接使用日志系統(tǒng)(Log4j、Logback)中的API,SLF4JAPI,使用門面模式的日志框架,有利于維importimportprivatestaticfinalLoggerlogger=【強制】日志
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 福建省南平市渭田中學高二語文下學期期末試卷含解析
- 福建省南平市太平中學高一數(shù)學理測試題含解析
- 2學會寬容(說課稿)統(tǒng)編版道德與法治六年級下冊
- 榮耀之路模板
- 專為電銷行業(yè)定制勞動協(xié)議樣本(2024年)版B版
- 外包采購分包合同(2篇)
- 復合手術(shù)室項目合同(2篇)
- 多平臺同步推廣合作協(xié)議
- 軟件技術(shù)開發(fā)合同完整協(xié)議范文
- 20《精彩極了和糟糕透了》說課稿-2024-2025學年五年級上冊語文統(tǒng)編版
- 2024年醫(yī)藥行業(yè)年終總結(jié).政策篇 易聯(lián)招采2024
- 《工業(yè)園區(qū)節(jié)水管理規(guī)范》
- 兒科護士述職報告2024
- 警校生職業(yè)生涯規(guī)劃
- 意識障礙患者的護理診斷及措施
- 股權(quán)投資協(xié)議的風險控制
- 酒店微笑服務(wù)培訓
- 浙江省嘉興市2023-2024學年七年級上學期語文期末試卷(含答案)
- 2025企業(yè)年會盛典
- 《鴻蒙智能互聯(lián)設(shè)備開發(fā)(微課版)》全套教學課件
- 215kWh工商業(yè)液冷儲能電池一體柜用戶手冊
評論
0/150
提交評論