媒体智能电视大数据编码规范.docx
《媒体智能电视大数据编码规范.docx》由会员分享,可在线阅读,更多相关《媒体智能电视大数据编码规范.docx(19页珍藏版)》请在三一文库上搜索。
1、5.【强制】采用4个空格缩进,禁止使用tab字符。说明:如果使用tab缩进,必须设置1个tab为4个空格。IDEA设置tab为4个空格时,请勿勾选1.setabcharacter:而在ec1.ipse中,必须勾选insertspacesfortabs0正例:(涉及1-5点)pub1.icstaticvoidmain(Stringargs)/缩进4个空格Stringsay=he1.1.o;/运算符的左右必须有一个空格intf1.ag=0;/关键词if与括号之间必须有一个空格,括号内的f与左括号,0与右括号不需要空格if(f1.ag=0)System.out.print1.n(say);/左大括号
2、前加空格且不换行;左大括号后换行if(f1.ag=1)System.out.printin(wor1.d);/右大括号前换行,右大括号后有e1.se,不用换行e1.seSystem,out.PrintIn(ok);/在右大括号后直接结束,则必须换行)6.【强制】注释的双斜线与注释内容之间有且仅有一个空格。正例:/这是示例注释,请注意在双斜线之后有一个空格StringparamnewString);10 .【强制】IDE的textfi1.eencoding设置为UTF-8;IDE中文件的换行符便用UniX格式,不要使用Windows格式。11 .【单个方法的总行数不超过80行。说明:除注释之外的
3、方法签名、左右大括号、方法内代码、空行、回车及任何不可见字符的总行数不超过80行。正例:代码逻辑分清红花和绿叶,个性和共性,绿叶逻辑单独出来成为额外方法,使主干代码更加清晰;共性逻辑抽取成为共性方法,便于复用和维护。12 .没有必要增加若干空格来使变量的赋值等号与上一行对应位置的等号对齐。正例:intone=1:1.ongtwo=21.;f1.oatthree=3F;StringBuiIdersb=newStringBui1.derO:说明:增加sb这个变量,如果需要对齐,则给one.two,three都要增加几个空格,在变量比较多的情况下,是非常累赘的事情。13 .,不同逻辑、不同语义、不同
4、业务的代码之间插入一个空行分隔开来以提升可读性。说明:任何情形,没有必要插入多个空行进行隔开。(四)OoP规约1 .【强制】避免通过一个类的对象引用访问此类的静态变量或静态方法,无谓增加编译器解析成本,直接用类名来访问即可。2 .【强制】所有的覆写方法,必须加的Verride注解。说明:getbject()与getbject()的问题。一个是字母的0,一个是数字的0,加SOverride可以准确判断是否覆盖成功。另外,如果在抽象类中对方法签名进行修改,其实现类会马上编译报错。3 .【强制】相同参数类型,相同业务含义,才可以使用Java的可变参数,避免使用Object。说明:可变参数必须放置在参
5、数列表的最后。(提倡同学们尽量不用可变参数编程)上例:pub1.ic1.istIistUsers(Stringtype,1.ong.ids)4 .【强制】外部正在调用或者二方库依赖的接口,不允许修改方法签名,避免对接口调用方产生影响。接口过时必须加如CPreCaIed注解,并清晰地说明采用的新接口或者新服务是什么。5 .【强制】不能使用过时的类或方法。说明:.UR1.Decoder中的方法decode(StringencodeStr)这个方法已经过时,应该使用双参数decode(Stringsource.Stringencode)接口提供方既然明确是过时接口,那么有义务同时提供新的接口;作为调
6、用方来说,有义务去考证过时方法的新实现是什么。6 .【强制】ObjeCt的equa1.s方法容易批空指针异常,应使用常量或确定有值的对象来调用equa1.s正例:test,equa1.s(object);反例:object,equa1.s(test);说明:推荐使用java.uti1.Objectstfequa1.s(JDK7引入的工具类)。7 .【强制】所有整型包装类对象之间值的比较,全部使用equa1.s方法比较。说明:对于Integervar=?在-128至127范围内的赋值,Integer对象是在IntegerCache.cache产生,会复用已有对象,这个区间内的Integer值可以
7、直接使用=进行判断,但是这个区间之外的所有数据,都会在堆上产生,并不会复用已有对象,这是一个大坑,推荐使用equa1.s方法进行判断。8 .【强制】浮点数之间的等值判断,基本数据类型不能用=来比较,包装数据类型不能用equa1.s来判断。说明:浮点数采用“尾数+阶码”的编码方式,类似于科学计数法的“有效数字+指数”的表示方式。二进制无法精确表示大部分的十进制小数,具体原理参考码出高效。反例:f1.oata1.0f-0.9f;f1.oatb=0.9f-0.8f:if(a=b)/预期进入此代码快,执行其它业务逻辑/但事实上a=b的结果为fa1.seF1.oatxF1.oat.va1.ue1.ia:
8、F1.oatyF1.oat.va1.*0f1b):ix.equa1.s:y:)(/预期进入此代码快,执行其它业务逻辑/但事实上equa1.s的结果为fa1.se)正例:(1)指定一个误差范围,两个浮点数的差值在此范围之内,则认为是相等的。f1.oata1.0f0.9f;f1.oatb0.9f-0.8f;f1.oatdiff1.e-6f:ifMath,absab)diff;Systemout.printin:true):(2)使用BigDecima1.来定义值,再进行浮点数的运算操作。BigDecima1.anewBigDecima1.1.0):BigDecima1.bnewBigDecima
9、1.0.9):BigDewBigDecima1.0.8:BigDecima1.x=a.subtractgeneratetoString时,如果继承了另一个POJO类,注意在前面加一下super.toStringo说明:在方法执行抛出异常时,可以直接调用POJO的toString()方法打印其属性值,便于排查问题。16 .【强制】禁止在POJO类中,同时存在对应属性XXX的isXxx()和getXxx()方法。说明:框架在调用属性XXX的提取方法时,并不能确定哪个方法一定是被优先调用到。17 .使用索引访问用String的sp1.it方法得到的数组时,需做最后一个分幅符后有无内容的检查,否则会有
10、把IndeXOUtofBOUndSEXCePtiOn的风险。说明:Stringstr=atb,c,;String11ary=str.sp1.it(,);/7于员期大于3,行果是3System,out.printin(ary.1.ength):18 .【当一个类有多个构造方法,或者多个同名方法,这些方法应该按顺序放置在一起,便于阅读,此条规则优先于下一条。19 .I类内方法定义的顺序依次是:公有方法或保护方法私有方法getter/setter方法。说明:公有方法是类的调用者和维护者最关心的方法,首屏展示最好;保护方法虽然只是子类关心,也可能是“模板设计模式”下的核心方法;而私有方法外部一般不需要
11、特别关心,是一个黑盒实现;因为承载的信息价值较低,所有Service和DO的getter/setter方法放在类体最后。20 .】setter方法中,参数名称与类成员变量名称一致,this.成员名=参数名。在getter/Setter方法中,不要增加业务逻辑,增加排查问题的难度。说明:对象c1.one方法默认是浅拷贝,若想实现深拷贝需覆写C1.one方法实现域对象的深度遍历式拷贝。24. t类成员与方法访问控制从严:1 )如果不允许外部直接通过new来创建对象,那么构造方法必须是privateo2)工具类不允许有pub1.ic或defau1.t构造方法。3)类非static成员变量并且与子类共
12、享,必须是protectedo4)类非static成员变量并且仅在本类使用,必须是privateo5)类static成员变量如果仅在本类使用,必须是privateo6)若是static成员变量,考虑是否为fina1.。7)类成员方法只供类内部调用,必须是PriVateI)8)类成员方法只对继承类公开,那么限制为protected.说明:任何类、方法、参数、变量,严控访问范围。过于宽泛的访问范围,不利于模块解耦。思考:如果是一个private的方法,想删除就删除,可是一个pub1.ic的service成员方法或成员变量,删除一下,不得手心冒点汗吗?变量像自己的小孩,尽量在自己的视线内,变量作用域
13、太大,无限制的到处跑,那么你会担心的。(五)集合处理1.【强制】关于hashCode和equa1.s的处理,遵循如不规则:1)只要覆写equa1.s,就必须覆写hashCode02)因为Set存储的是不重复的对象,依据hashCode和equa1.s进行判断,所以Set存储的对象必须榄写这两个方法。3)如果自定义对象作为Map的键,那么必须覆写IiashCode和equa1.so说明:String已覆写hashCode和equa1.s方法,所以我们可以愉快地使用String对象作为key来使用。2.【强制】Array1.iSt的SUb1.iSt结果不可强转成Array1.ist,否则会抛出C1
14、assCastException异常,即java.uti1.RandomAccessSub1.istcannotbecasttojava.uti1.Array1.isto说明:sub1.ist返回的是Array1.iSt的内部类Sub1.ist,并不是Array1.iSt而是Array1.ist的一个视图,对于Sub1.ist子列表的所有操作最终会反映到原列表上。8 .【强制】使用工具类ArrayS.as1.ist()把数组转换成集合时,不能使用其修改集合相关的方法,它的add/remove/cIear方法会抛出UnsupportedOperatiOnException异常。说明:as1.i
15、st的返回对象是一个Arrays内部类,并没有实现集合的修改方法。Arrays.as1.ist体现的是适配器模式,只是转换接口,后台的数据仍是数组。Stringstr=newString,yang,hao;1.ist1.ist=Arrays.as1.ist(str);第一种情况:1.ist,addCyangguanbao);运行时异常。第二种情况:str01=changed;也会随之修改,反之亦然。9 .【强制】泛型通配符?extendsT来接收返回的数据,此写法的泛型集合不能使用add方法,而?superT不能使用get方法,作为接口调用赋值时易出错。说明:扩展说一下PECS(Produce
16、rExtendsConsumerSUPer)原则:第一、频繁往外读取内容的,适合用?extendsTo第二、经常往里插入的,适合用?superT10 .【强制】在无泛型限制定义的集合赋值给泛型限制的集合时,在使用集合元素时,需要进行instanceof判断,避免抛出C1.assCastException异常。说明:毕竟泛型是在JDK5后才出现,考虑到向前兼容,编译器是允许非泛型集合与泛型集合互相赋值。反例:1.istStringgenericsnu1.1.1.istRotGenericsnewArray1.ist10;notGenericsaddnewObject1):notGenerics.
17、addnewInteger11:genericsnotGenerics:/此处抛出C1.assCastException异常Stringstringgenerics.get1O:11 .【强制】不要在foreach循环里进行元素的remove/add操作。remove元素请使用Iterator方式,如果并发操作,需要对IteratOr对象加锁。nameprefixBromUserThreadFactory1S-WhatFeaturOfGroup+-Worker-:OverridepubicThreadnewThr111.);ThreadthreadnewThreadnu1.1.,task.na
18、me.O,fa1.se):Systemout.printInithreadgetName:);returnthread;)3 .【强制】线程资源必须通过线程池提供,不允许在应用中自行显式创建线程。说明:线程池的好处是减少在创建和销毁线程上所消耗的时间以及系统资源的开销,解决资源不足的问题。如果不使用线程池,有可能造成系统创建大量同类线程而导致消耗完内存或者“过度切换”的问题。4 .【强制】线程池不允许使用Executors去创建,而是通过ThreadPoo1.Executor的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。说明:Executors返回的线程池对象的
19、弊端如下:1)FixedThreadPoo1.和Sing1.eThreadPoo1.:允许的请求队列长度为Integer.MAXJtA1.UE,可能会堆积大量的请求,从而导致OoMo2)CachedThreadPoo1:允许的创建线程数量为IntegerNAXVA1.UE,可能会创建大量的线程,从而导致OOMo5.【强制】SinIPIeDateFOrmat是线程不安全的类,一般不要定义为static变量,如果定义为static,必须加锁,或者使用DateUtiIS工具类。正例:注意线程安全,使用DateUti1.s0亦推荐如下处理:锁方法与try代码块之间没有任何可能抛出异常的方法调用,避免加
20、锁成功后,在fina1.1.y中无法解锁。说明一:如果在1.ock方法与try代码块之间的方法调用抛出异常,那么无法解锁,造成其它线程无法成功获取锁。说明二:如果1.ock方法在try代码块之内,可能由于其它方法抛出异常,导致在fina1.1.y代码块中,un1.ock对未加锁的对象解锁,它会调用AQS的IryRCIeaSe方法(取决于具体实现类),抛出11Iega1.MonitorStateException异常。说明三:在1.ock对象的1.ock方法实现中可能抛出unchecked异常,产生的后果与说明二相同。正例:1.ock1.ock=newXxx1.ockO;/.1.ock,1.oc
21、k();trydoSomething();doOthers();fina1.1.y1.ock,un1.ock();反例:)1.ock1.ock=newXxx1.ockO;/.try/如果此处抛出异常,则直接执行fina1.1.y代码块doSomething();/无论加锁是否成功,fina1.1.y代码块都会执行1.ock,1.ock();doOthers();fina1.1.y13. 资金相关的金融敏感信息,使用悲观锁策略I;说明:乐观锁在获得锁的同时巳经完成了更新操作,校验逻辑容易出现漏洞,另外,乐观锁对冲突的解决策略有较复杂的要求,处理不当容易造成系统压力或数据异常,所以资金相关的金融敏
22、感信息不建议使用乐观锁更新。14. 使用Coun1.Down1.atch进行异步转同步操作,每个线程退出前必须调用CountDown方法,线程执行代码注意catch异常,确保CountDown方法被执行到,避免主线程无法执行至await方法,直到超时才返回结果。说明:注意,子战程抛出异常堆栈,不能在主线程Ey-Catch至九15. 避免Random实例被多线程使用,虽然共享该实例是线程安全的,但会因竞争同一seed导致的性能下降。说明:Random实例包括java,utiI.Random的实例或者Math.randomO的方式O王例:在JDK7之后,可以直接使用APIThread1.oca1R
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 媒体 智能 电视 数据 编码 规范
