媒体直播大数据编码规范.docx
《媒体直播大数据编码规范.docx》由会员分享,可在线阅读,更多相关《媒体直播大数据编码规范.docx(20页珍藏版)》请在三一文库上搜索。
1、for(inti0;igeneratetoString时,如果继承了另一个POJO类,注意在前面加一下super.toStringo说明:在方法执行抛出异常时,可以直接调用POJO的toString()方法打印其属性值,便于排查问题。16 .【强制】禁止在POJO类中,同时存在对应属性XXX的isXxx()和getXxx()方法。说明:框架在调用属性XXX的提取方法时,并不能确定哪个方法一定是被优先调用到。17 .使用索引访问用String的sp1.it方法得到的数组时,需做最后一个分幅符后有无内容的检查,否则会有把IndeXOUtofBOUndSEXCePtiOn的风险。说明:Strings
2、tr=atb,c,;String11ary=str.sp1.it(,);/7于员期大于3,行果是3System,out.printin(ary.1.ength):18 .【当一个类有多个构造方法,或者多个同名方法,这些方法应该按顺序放置在一起,便于阅读,此条规则优先于下一条。19 .I类内方法定义的顺序依次是:公有方法或保护方法私有方法getter/setter方法。说明:公有方法是类的调用者和维护者最关心的方法,首屏展示最好;保护方法虽然只是子类关心,也可能是“模板设计模式”下的核心方法;而私有方法外部一般不需要特别关心,是一个黑盒实现;因为承载的信息价值较低,所有Service和DO的ge
3、tter/setter方法放在类体最后。20 .】setter方法中,参数名称与类成员变量名称一致,this.成员名=参数名。在getter/Setter方法中,不要增加业务逻辑,增加排查问题的难度。说明:对象c1.one方法默认是浅拷贝,若想实现深拷贝需覆写C1.one方法实现域对象的深度遍历式拷贝。24. t类成员与方法访问控制从严:1 )如果不允许外部直接通过new来创建对象,那么构造方法必须是privateo2)工具类不允许有pub1.ic或defau1.t构造方法。3)类非static成员变量并且与子类共享,必须是protectedo4)类非static成员变量并且仅在本类使用,必须
4、是privateo5)类static成员变量如果仅在本类使用,必须是privateo6)若是static成员变量,考虑是否为fina1.。7)类成员方法只供类内部调用,必须是PriVateI)8)类成员方法只对继承类公开,那么限制为protected.说明:任何类、方法、参数、变量,严控访问范围。过于宽泛的访问范围,不利于模块解耦。思考:如果是一个private的方法,想删除就删除,可是一个pub1.ic的service成员方法或成员变量,删除一下,不得手心冒点汗吗?变量像自己的小孩,尽量在自己的视线内,变量作用域太大,无限制的到处跑,那么你会担心的。(五)集合处理1.【强制】关于hashCo
5、de和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.assCastException异常,即java.uti1.RandomAcc
6、essSub1.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.ist的返回对象是一个Arrays内部类,并没有实现集合的修改方法。Arrays.
7、as1.ist体现的是适配器模式,只是转换接口,后台的数据仍是数组。Stringstr=newString,yang,hao;1.ist1.ist=Arrays.as1.ist(str);第一种情况:1.ist,addCyangguanbao);运行时异常。第二种情况:str01=changed;也会随之修改,反之亦然。9 .【强制】泛型通配符?extendsT来接收返回的数据,此写法的泛型集合不能使用add方法,而?superT不能使用get方法,作为接口调用赋值时易出错。说明:扩展说一下PECS(ProducerExtendsConsumerSUPer)原则:第一、频繁往外读取内容的,适合
8、用?extendsTo第二、经常往里插入的,适合用?superT10 .【强制】在无泛型限制定义的集合赋值给泛型限制的集合时,在使用集合元素时,需要进行instanceof判断,避免抛出C1.assCastException异常。说明:毕竟泛型是在JDK5后才出现,考虑到向前兼容,编译器是允许非泛型集合与泛型集合互相赋值。反例:1.istStringgenericsnu1.1.1.istRotGenericsnewArray1.ist10;notGenericsaddnewObject1):notGenerics.addnewInteger11:genericsnotGenerics:/此处抛
9、出C1.assCastException异常Stringstringgenerics.get1O:11 .【强制】不要在foreach循环里进行元素的remove/add操作。remove元素请使用Iterator方式,如果并发操作,需要对IteratOr对象加锁。Overridepub1.icintcompare(Studento1.,Studento2)returno1.get1.d()o2.getIdO?1:-1;);13. 集合泛型定义时,在JDK7及以上,使用diamond语法或全省略。说明:菱形泛型,即diamond,直接使用来指代前边巳经指定的类型。正例:/diamond方式,即
10、use*Cache=newHashMapO(16);/全省略方式Array1.istusers=newArray1.ist(10):14. 集合初始化时,指定集合初始值大小。说口月:HaShMaP使用IIashMap(intinitia1.capacity)初始化正例:initia1.capacity=(需要存储的元素个数/负载因子)+1,注意负载因子(即1.oaderfactor)默认为0.75,如果簪时无法确定初始值大小,请设置为16(即默认值)。反例:HaShMaP需要放置1024个元素,由于没有设置容量初始大小,随着元素不断增加,容量7次被迫扩大,resize需要重建hash表,严重影
11、响性能。15. 使用entrySet遍历Map类集合KV,而不是keySet方式进行遍历。说明:keySet其实是遍历了2次,一次是转为Iterator对象,另一次是从hashMap中取出key所对应的VaIUeO而entrySet只是遍历了一次就把key和va1.ue都放到了entry中,效率更高。如果是JDK8,使用Map.forEach方法。工例:VaIUeS()返回的是V值集合,是一个1.ist集合对象;keySet()返回的是K值集合,是一个Set集合对象;entrySet()返回的是K-V值组合集合。16. 高度注意Map类集合K/V能不能存储nu1.1.值的情况,如下表格:nam
12、eprefixBromUserThreadFactory1S-WhatFeaturOfGroup+-Worker-:OverridepubicThreadnewThr111.);ThreadthreadnewThreadnu1.1.,task.name.O,fa1.se):Systemout.printInithreadgetName:);returnthread;)3 .【强制】线程资源必须通过线程池提供,不允许在应用中自行显式创建线程。说明:线程池的好处是减少在创建和销毁线程上所消耗的时间以及系统资源的开销,解决资源不足的问题。如果不使用线程池,有可能造成系统创建大量同类线程而导致消耗完内
13、存或者“过度切换”的问题。4 .【强制】线程池不允许使用Executors去创建,而是通过ThreadPoo1.Executor的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。说明:Executors返回的线程池对象的弊端如下:1)FixedThreadPoo1.和Sing1.eThreadPoo1.:允许的请求队列长度为Integer.MAXJtA1.UE,可能会堆积大量的请求,从而导致OoMo2)CachedThreadPoo1:允许的创建线程数量为IntegerNAXVA1.UE,可能会创建大量的线程,从而导致OOMo5.【强制】SinIPIeDateFOr
14、mat是线程不安全的类,一般不要定义为static变量,如果定义为static,必须加锁,或者使用DateUtiIS工具类。正例:注意线程安全,使用DateUti1.s0亦推荐如下处理:锁方法与try代码块之间没有任何可能抛出异常的方法调用,避免加锁成功后,在fina1.1.y中无法解锁。说明一:如果在1.ock方法与try代码块之间的方法调用抛出异常,那么无法解锁,造成其它线程无法成功获取锁。说明二:如果1.ock方法在try代码块之内,可能由于其它方法抛出异常,导致在fina1.1.y代码块中,un1.ock对未加锁的对象解锁,它会调用AQS的IryRCIeaSe方法(取决于具体实现类),
15、抛出11Iega1.MonitorStateException异常。说明三:在1.ock对象的1.ock方法实现中可能抛出unchecked异常,产生的后果与说明二相同。正例:1.ock1.ock=newXxx1.ockO;/.1.ock,1.ock();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();doOth
16、ers();fina1.1.y13. 资金相关的金融敏感信息,使用悲观锁策略I;说明:乐观锁在获得锁的同时巳经完成了更新操作,校验逻辑容易出现漏洞,另外,乐观锁对冲突的解决策略有较复杂的要求,处理不当容易造成系统压力或数据异常,所以资金相关的金融敏感信息不建议使用乐观锁更新。14. 使用Coun1.Down1.atch进行异步转同步操作,每个线程退出前必须调用CountDown方法,线程执行代码注意catch异常,确保CountDown方法被执行到,避免主线程无法执行至await方法,直到超时才返回结果。说明:注意,子战程抛出异常堆栈,不能在主线程Ey-Catch至九15. 避免Random实
17、例被多线程使用,虽然共享该实例是线程安全的,但会因竞争同一seed导致的性能下降。说明:Random实例包括java,utiI.Random的实例或者Math.randomO的方式O王例:在JDK7之后,可以直接使用APIThread1.oca1Random,而在JDK7之前,需要编码保证每个线程持有一个实例。16. 在并发场景下,通过双重检查锁(doub1.e-checked1.ocking)实现延迟初始化的优化问题隐患(可参考TheDoub1.e-Checked1.ockingisBrokenDec1.aration),推荐解决方案中较为简单一种(适用于JDK5及以上版本),将目标属性声明
18、为vo1.ati1.e型。反例:pub1.icc1.ass1.azyInitDemo.privateHe1.perhe1.per=nu1.1.;pub1.icHe1.pergetHe1.per()if(he1.per=nu1.1)synchronized(this)if(he1.per=nu1.1.)he1.per=newHe1.pcrO;)returnhe1.per;/othermethodsandfie1.ds.)反例:pub1.icfina1.voidacquire(1.ongarg)if(!trycquire(arg)&acquireQueued(addWaiter(Node.EXC1
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 媒体 直播 数据 编码 规范
