




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
规约 1(一)命名规约 1 (三)格式规约 4(四)OOP规约 6(五)集合处理 10(六)并发处理 12(七)控制语句 15(八)注释规约 16(九)其它 17二、异常日志 19(一)异常处理 19 、MySQL规约 22(一)建表规约 22(二)索引规约 23(三)SQL规约 25(四)ORM规约 26四、工程规约 27(一)应用分层 27(二)二方库规约 28(三)服务器规约 30五、安全规约 311.0.02017.2.9(一)命名规约反例:_name/__name/$Object/name_/name$/Object$反例:DaZhePromotion[打折]/getPingfenByName()[评分]/int某变量=3正例:alibaba/taobao/youku/hangzhou等国际通用的名称,可视同英文。的相关命名)DO/BO/DTO/VO等。正例:MarcoPolo/UserDO/XmlService/TcpUdpDeal/TaPromotion反例:macroPolo/UserDo/XMLService/TCPUDPDeal/TAPromotion正例:localValue/getHttpMessage()/inputUserId正例:MAX_STOCK_COUNTCOUNT号是数组类型的一部分,数组定义如下:String[]args;反例:定义为基本数据类型booleanisSuccess;的属性,它的方法也是isSuccess(),RPCing反例:AbstractClass“缩写”命名成AbsClass;condition“缩写”命名成condi,此类正例:publicclassOrderFactory;publicclassLoginProxy;publicclassResourceObserver;f接口基础常量表示:StringCOMPANY="alibaba";反例:接口方法定义:publicabstractvoidf();正例:AbstractTranslator实现Translatable。m正例:枚举名字:DealStatusEnum,成员名称:SUCCESS/UNKOWN_REASON。A)Service/DAO层方法命名规约1)获取单个对象的方法用get做前缀。trtB)领域模型命名规约4)POJO是DO/DTO/BO/VO的统称,禁止命名成xxxPOJO。(二)常量定义反例:Stringkey="Id#taobao_"+tradeId;acheputkeyvalue类A中:publicstaticfinalStringYES="yes";类B中:publicstaticfinalStringYES="y";/34/34ant5)类内共享常量:直接在类内部privatestaticfinal定义。umSATURDAY(6),SUNDAY(7);}(三)格式规约现空ifforwhileswitchdo须加空格。请勿勾选Usetabcharacter;而在eclipse中,必须勾选insertspacesfortabs。publicstaticvoidmain(Stringargs[]){Stringsay="hello";//运算符的左右必须有一个空格intflag=0;if(flag==0){System.out.println(say);}//左大括号前加空格且不换行;左大括号后换行if(flag==1){System.out.println("world");号后有else,不用换行}else{System.out.println("ok");//在右大括号后直接结束,则必须换行}}换行。StringBuffersb=newStringBuffer();sb.append("zi").append("xin")append("huang")append("huang")append("huang");StringBuffersb=newStringBuffer();sb.append("zi").append("xin")...append("huang");method(args1,args2,args3,...,argsX);method("a","b","c");不要使用windows格式。inta=3;longb=4L;floatc=5F;StringBuffersb=newStringBuffer();正例:publicUsergetUsers(Stringtype,Integer...ids)recated该使用双参数decode(Stringsource,Stringencode)。接口提供方既然明确是过时接口,equals。正例:"test".equals(object);反例:object.equals("test");KC使用基本数据类型。ate】序列化类新增属性时,请不要修改serialVersionUID字段,避免反序列失败;如果完全不兼容升级,避免反序列化混乱,那么请修改serialVersionUID值。g内容的检查,否则会有抛IndexOutOfBoundsException的风险。Stringstr="a,b,c,,";String[]ary=str.split(",");System.out.println(ary.length);有方法或保护方法>私有方法>getter/settergetter/setter方法中,尽量不要增加业务逻辑,增加排查问题的难度。publicIntegergetData(){if(true){returndata+100;}else{returndata-100;}}Stringstr="start";for(inti=0;i<100;i++){str=str+"hello";}ng。final44static变量并且与子类共享,必须是protected。rivateate7)类成员方法只供类内部调用,必须是private。8)类成员方法只对继承类公开,那么限制为protected。(五)集合处理1)只要重写equals,就必须重写hashCode。2.【强制】ArrayList的subList结果不可强转成ArrayList,否则会抛出ClassCastException异常:java.util.RandomAccessSubListcannotbecasttojava.util.ArrayList;说明:subList返回的是ArrayList的内部类SubList,并不是ArrayList,而是ArrayList的一个视图,对于SubList子列表的所有操作最终会反映到原列表上。加、删除均产生ConcurrentModificationException异常。4.【强制】使用集合转数组的方法,必须使用集合的toArray(T[]array),传入的是类型完全e类型数组将出现ClassCastException错误。List<String>list=newArrayList<String>(2);list.add("guan");list.add("bao");String[]array=newString[list.size()];array=list.toArray(array);内存空间,并返回新数组地址;如果数组元素大于实际所需,下标为[list.size()]的数组null参数组大小定义与集合元素法,它的add/remove/clear方法会抛出UnsupportedOperationException异常。tString[]str=newString[]{"a","b"};Listlist=Arrays.asList(str);第二种情况:str[0]="gujin";那么list.get(0)也会随之修改。6.【强制】泛型通配符<?extendsT>来接收返回的数据,此写法的泛型集合不能使用add方说明:苹果装箱后返回一个<?extendsFruits>对象,此对象就不能往里加任何水果,包括List<String>a=newArrayList<String>();a.add("1");a.add("2");for(Stringtemp:a){if("1".equals(temp)){a.remove(temp);}}Iterator<String>it=a.iterator();while(it.hasNext()){Stringtemp=it.next();if(删除元素的条件){it.remove();}}Collections.sort会报IllegalArgumentException异常。newComparator<Student>(){@Overridepublicintcompare(Studento1,Studento2){returno1.getId()>o2.getId()?1:-1;}}说明:ArrayList尽量使用ArrayList(intinitialCapacity)初始化。集合类KeyValueSuper说明Hashtable不允许为null不允许为nullDictionary线程安全ConcurrentHashMap不允许为null不允许为nullAbstractMap分段锁技术TreeMap不允许为null允许为nullAbstractMap线程不安全HashMap允许为null允许为nullAbstractMap线程不安全12.【参考】合理利用好集合的有序性(sort)和稳定性(order),避免集合的无序性(unsort)和不稳定性(unorder)带来的负面影响。依次排列的。如:ArrayList是order/unsort;HashMap是unorder/unsort;TreeSet是order/sort。(六)并发处理publicclassTimerTaskThreadextendsThread{publicTimerTaskThread(){super.setName("TimerTaskThread");...}“过度切换”的问题。or。1)FixedThreadPool和SingleThreadPool:允许的请求队列长度为Integer.MAX_VALUE,可能会堆积大量的请求,从而导致OOM。2)CachedThreadPool和ScheduledThreadPool:允许的创建线程数量为Integer.MAX_VALUE,可能会创建大量的线程,从而导致OOM。static,必须加锁,或者使用DateUtils工具类。privatestaticfinalThreadLocal<DateFormat>df=newThreadLocal<DateFormat>(){@OverrideprotectedDateFormatinitialValue(){returnnewSimpleDateFormat("yyyy-MM-dd");}arDateTimeFormatter代替Simpledateformatter,官方给出的解释:simplebeautifulstrongimmutablethread-safe。荐】使用CountDownLatch进行异步转同步操作,每个线程退出前必须调用countDownseed导致的性能下降。12.【推荐】通过双重检查锁(double-checkedlocking)(在并发场景)实现延迟初始化的优化问题隐患(可参考The"Double-CheckedLockingisBroken"Declaration),推荐问题classFoo{privateHelperhelper=null;publicHelpergetHelper(){if(helper==null)synchronized(this){if(helper==null)helper=newHelper();}returnhelper;}//otherfunctionsandmembers...}ntAtomicIntegercount=newAtomicInteger();count.addAndGet(1);如果是JDK8,推(七)控制语句2.【强制】在if/else/for/while/do语句中必须使用大括号,即使只有一行代码,避免使用下面的形式:if(condition)statements;if(condition){returnobj;}elseifelse//伪代码如下booleanexisted=(file.open(fileName,"w")!=null)&&(...)||(...);if(existed){}if((file.open(fileName,"w")!=null)&&(...)||(...)){}2)执行时间开销很大的方法,参数校验时间几乎可以忽略不计,但如果因为参数错误导致方法。4)对外提供的开放接口,不管是RPC/API/HTTP接口。限入口。1)极有可能被循环调用的方法,不建议对参数进行校验。但在方法说明里必须注明外部参2)底层的方法调用频度都比较高,一般不校验。毕竟是像纯净水过滤的最后一道,参数错DAOService在同一(八)注释规约行,使用//注释。方法内部多行注释使用/**/注释,注意与代码对齐。问题说清楚。专有名词与关键字保持掉(代码仓库保存了历史代码)。的//putelephantintofridgeput(elephant,fridge);E(九)其它说明:不要在方法体内定义:Patternpattern=Pattern.compile(规则);isXxx法。r5.【强制】获取当前毫秒数System.currentTimeMillis();而不是newDate().getTime();件、动态配置属性(一)异常处理IndexOutOfBoundsException/NullPointerException,这类异常由程序员预检查正例:if(obj!=null){...}反例:try{obj.method()}catch(NullPointerExceptione){...}esn。反例:publicintf(){returnInteger对象};如果为null,自动解箱抛NPE。库的查询结果可能为null。3)集合里的元素即使isNotEmpty,取出的数据元素也可能为null。t装isSuccess、“错误码”、“错误简短信息”。区分unchecked/checked异常,避免直接使用RuntimeException抛出,过的自定义异常,如:DAOException/ServiceException等。13.【参考】避免出现重复的代码(Don’tRepeatYourself),即DRY原则。privatebooleancheckParam(DTOdto){...}LogjLogbackAPI使用日志框架importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;privatestaticfinalLoggerlogger=LoggerFactory.getLogger(Abc.class);appName_logType_logName.log。logType:日志类型,推荐分类有stats/desc/monitor/visit等;logName:日志描述。这种命名的好处:通过文件名就可知mppserver_monitor_timeZoneConvert.log说明:logger.debug("Processingtradewithid:"+id+"symbol:"+symbol);会执行toString()方法,浪费了系统资源,执行了上述操作,最终日志却没有打印。if(logger.isDebugEnabled()){logger.debug("Processingtradewithid:"+id+"symbol:"+symbol);}logger.debug("Processingtradewithid:{}symbol:{}",id,symbol);正例:<loggername="com.taobao.dubbo.config"additivity="false">正例:logger.error(各类参数或者对象toString+"_"+e.getMessage(),e);(一)建表规约正例:getter_admin,task_config,level3_name反例:GetterAdmin,taskConfig,level_3_nametext来对应,避免影响其它字段索gmt_modified的类型均为date_time类型。正例:tiger_task/tiger_reader/mpp_config联查询。是提升检int使用bigint。(二)索引规约;另外,即使在应用层做了非常完善的校验和控制,只要没有唯一索引,根据墨菲定律,度会高达90%以上,可以使用count(distinctleft(列名,索引长度))/count(*)的区分度5.【推荐】如果有orderby的场景,请注意利用索引的有序性。orderby最后的字段是组合正例:wherea=?andb=?orderbyc;索引:a_b_c反例:索引中有范围查找,那么索引有序性无法利用,如:WHEREa>10ORDERBYb;索引。SELECTa.*FROM表1a,(selectidfrom表1where条件LIMIT100000,20)bwherea.id=b.id2)ref指的是使用普通的索引(normalindex)。3)range对索引进行范围检索。误认为唯一索引一律需要在应用层通过“先查后插”方式解决。ntcountcountSQLL2.【强制】count(distinctcol)计算该列除NULL之外的不重复数量。注意count(distinctcol1,col2)如果其中一列全为NULL,那么即使另一列有不同的值,也返回为0。NULLSUMgSUMgFROMtable;1)NULL<>NULL的返回结果是NULL,而不是false。2)NULL=NULL的返回结果是NULL,而不是true。3)NULL<>1的返回结果是NULL,而不是true。如果更新学生表中的student_id,同时触发成绩表中的student_id更新,则为级联更新。tSELECTLENGTH("轻松工作");返回为12SELECTCHARACTER_LENGTH("轻松工作");返回为4说明:TRUNCATETABLE在功能上与不带WHERE子句的DELETE语句相同。p5.【强制】iBATIS自带的queryForList(StringstatementName,intstart,intsize)不推说明:其实现方式是在数据库取到statementName对应的SQL语句的所有记录,再通过subListMap<String,Object>map=newHashMap<String,Object>();map.put("start",start);map.put("size",size);段,都进行updatetablesetc1=value1,c2=value2,c3=value3;这是不对的。执行SQL上此条件;<isNotEmpty>表示不为空且不为null时执行;<isNotNull>表示不为null值时(一)应用分层PWeb转发,各类基本参数校验,或者不复用的业务简单处理等。Service层:相对具体的业务逻辑服务层。Manager层:通用业务处理层,它有如下特征:1)对第三方平台封装的层,预处理返回结果及转化异常信息;Ocatch,使用catch(Exceptione)方式,并thrownewDAOException(e),不需要打印日志,因为日志在Manager/Service层一定需要捕获并打到日志文件中去,如果同台服务器再打日ODO(DataObject):与数据库表结构一一对应,通过DAO层向上传输数据源对象。DT
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 第6讲大一统多民族封建国家的发展与衰亡从隋唐盛世到五代十国课件-高三统编版必修中外历史纲
- 护理行为美的课件
- 生活小窍门小学生课件
- 2025年贵州省大数据项目创业计划书
- 小学六年级的题目及答案
- 小升初数学题库及答案
- 期末真题汇编 14 古诗歌鉴赏(含答案)-8年级语文下册(统编版)
- 生殖康复护理课件视频
- 人教版三年级语文下册《赵州桥》教学课件
- 教学课件怎么排版好看
- 2025年浙江省嘉兴市南湖区中考二模英语试题(含答案无听力原文及音频)
- T/SHPTA 071.1-2023高压电缆附件用橡胶材料第1部分:绝缘橡胶材料
- 生产基层管理培训课程
- 2025至2030年中国猪预混料行业投资前景及策略咨询研究报告
- 2025年中央八项规定精神学习教育应知应会考试题库(含答案)
- 云南2025年云南省社会科学院中国(昆明)南亚东南亚研究院招聘高层次人才笔试历年参考题库附带答案详解
- 2025年浙江省温州市乐清市中考二模语文试题(含答案)
- 果园苹果买卖合同协议书
- 分析定向增发“盛宴”背后的利益输送现象、理论根源及制度原因
- 美容院开店流程与注意事项
- (人教版)2025年中考生物真题试题(含解析)
评论
0/150
提交评论