![](https://s5-media.51cto.com/ost/pc/static/noavatar.gif)
回复
常言道:无规矩不成方圆。
公司一般都有自己的编码规范,为了让开发人员按规范执行,公司也会进行一些强制性的措施。比如,不按规范查到一次绩效扣1分,或者是这月奖金扣个几十块,或者是在工作群里发个大红包等等。我有个朋友公司更狠,发现一次当月绩效奖金直接为0!这不,一不小心就被抓到了,让本不富裕的家庭变得“雪上加霜”!
编码规范既然制定了,咱们就得遵守,毕竟谁会跟钱过不去呢!
另外,如你们团队还没有编码规范,赶紧制定起来吧。好处我就不说了,下面附上通用的编码规范,可以根据自己公司的业务做调整。(有点长,建议先收藏)
UpperCamCamelCase
风格,但DO
、PO
、DTO
、VO
、BO
等除外lowerCamelCase
,必须遵守驼峰命名Abstract
或者Base
开头,异常类必须以Exception
结尾,测试类以测试的类的名称开头Test
结尾POJO
类中布尔类型变量不要加is前缀idList
、TERMINATED_TREAD_COUNT
javadoc
。AbstractTranslator
实现Translatable
接口Enum
后缀,枚举成员名称全大写,单词间用下划线隔开get
做前缀list
做前缀,如:listObjects
3.获取统计值的方法用count
做前缀save/insert
做前缀delete/remove
做前缀xxxDO
, xxx
为数据库表名xxxDTO
,xxx
为业务模型相关名称xxxVO
,xxx
一般为网页名称POJO
是对DO
、DTO
、VO
、BO
的统称,禁止xxxPOJO
Long
类型中赋值,数值后使用大写Lconstant目录
下constant目录
下constant目录
下constant目录
下private static final
定义enum
类型定义else
等代码换行,否则不换行if (a == b)
text file encoding
设置为UTF-8;IDE中 文件的换行符使用Unix格式@Override
注解java
可变参数@Deprecated
注解,并说明新接口或者新服务是什么Object
的equals
方法容易抛出空指针,应使用常量或者确定值的对象来调用equalsequals
方法比较==
,包装类不能用equals
。BigDecimal
来定义值,再进行浮点数的运算操作。BigDecimal(double)
方式将double
对象转换成BigDecimal
。建议使用BigDecimal
的valueOf
方法POJO
的属性必须用包装类型;RPC
方法的参数和返回值必须使用包装类型;POJO
不要对其属性设置默认值。serialVersionUID
字段。init()
。toString
方法。POJO
类中对属性xxx 同时存在isXxx()
和getXxx()
String
的split
方法得到数组时,需要对最后一个分隔符有无内容做检查setter
方法中参数名称和成员变量名称一致,不要在getter
和setter
方法中加业务逻辑StringBuilder
的append
方法进行扩展final
可以修饰类,方法,变量。Object
的clone
方法public
或default
构造方法。static
成员变量并且与子类共享,必须是protected
。private
。static
成员变量如果仅在本类使用,必须是private
。static
成员变量,考虑是否为final
。private
。protected
。Collections
类返回的对象,如:emptyList()/singletonList()
等都是immutablelist
不可对其进行添加或者删除元素的操作ConcurrentModificationException
异常toArray(T[] array)
,传入的是类型完全一致、长度为0的空数组Collection
接口任何实现类的addAll()
方法时,一定要对输入的集合做NEP判断Arrays.asList()
把数组转换成集合时,不能使用其修改集合相关的方法,它的add/remove/clear
方法会抛出UnsupportedOperationException
异常asList
的返回对象是一个Arrays
内部类,并没有实现集合的修改方法。Arrays.asList
体现的是适配器模式,只是转换接口,后台的数据仍是数组。instanceof
判断,避免抛出ClassCastException
异常foreach
循环里进行元素的remove/add
操作。remove
元素请使用Iterator
方式,如果并发操作,需要对Iterator
对象加锁JDK7
版本及以上,Comparator
实现类要满足如下三个条件,不然Arrays.sort
,Collections.sort
会抛IllegalArgumentException
异常。diamond
语法或全省略。entrySet
遍历Map 类集合KV,而不是keySet
方式进行遍历集合类 | Key | Value | Super | 说明 |
HashTable | 不允许为null | 不允许为null | Dictionary | 线程安全 |
ConcurrentHashMap | 不允许为null | 不允许为null | AbstractMap | 锁分段技术(JDK8:CAS) |
TreeMap | 不允许为null | 允许为null | AbstractMap | 线程不安全 |
HashMap | 允许为null | 允许为null | AbstractMap | 线程不安全 |
contains
方法进行遍历、对比、去重操作Executors
去创建,而是通过ThreadPoolExecutor
的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险SimpleDateFormat
是线程不安全的类,一般不要定义为static变量,如果定义为static,必须加锁,或者使用DateUtils
工具类。ThreadLocal
变量,尤其在线程池场景下,线程经常会被复用,如果不清理自定义的ThreadLocal
变量,可能会影响后续业务逻辑和造成内存泄露等问题。尽量在代理中使用try-finally
块进行回收try
代码块之外,并且在加锁方法与try代码块之间没有任何可能抛出异常的方法调用,避免加锁成功后,在finally
中无法解锁。version
作为更新依据ScheduledExecutorService
则没有这个问题CountDownLatch
进行异步转同步操作,每个线程退出前必须调用countDown
方法,线程执行代码注意catch
异常,确保countDown
方法被执行到,避免主线程无法执行至await
方法,直到超时才返回结果Random
实例被多线程使用,虽然共享该实例是线程安全的,但会因竞争同一seed 导致的性能下降(double-checked locking)
实现延迟初始化的优化问题隐患(可参考The “Double-Checked Locking is Broken” Declaration
),推荐解决方案中较为简单一种(适用于JDK5及以上版本),将目标属性声明为 volatile型volatile
解决多线程内存不可见问题。对于一写多读,是可以解决变量同步问题,但是如果多写,同样无法解决线程安全问题。HashMap
在容量不够进行resize
时由于高并发可能出现死链,导致CPU飙升,在开发过程中可以使用其它数据结构或加锁来规避此风险ThreadLocal
对象使用static修饰,ThreadLocal
无法解决共享对象的更新问题case
要么通过continue/break/return
等来终止,要么注释说明程序将继续执行到哪一个case
为止;在一个switch
块内,都必须包含一个default语句
并且放在最后,即使它什么代码也没有String
并且此变量为外部参数时,必须先进行null判断if/else/for/while/do
语句中必须使用大括号if-else
方式try-catch
操作(这个try-catch是否可以移至循环体外)。Service
层都在同一个应用中,部署在同一台服务器中,所以DAO的参数校验,可以省略。不得使用// xxx方式
isXxx()
方法$!{var}
——中间的感叹号System.currentTimeMillis()
; 而不是newDate().getTime()
;RuntimeException
异常不应该通过catch方式处理。如NullPointException
、IndexOutOfBoundsException
。isNotEmpty
,取出来的元素也可能是nullunchecked / checked
异常,避免直接抛出new RuntimeException(),更不允许抛出Exception或者Throwable,应使用有业务含义的自定义异常。推荐业界已定义过的自定义异常,如:DAOException / ServiceException
等Result
方式,封装isSuccess()
方法、“错误码”、“错误简短信息”Don’t Repeat Yourself
),即DRY原则appName_logType_logName.log
。logType:日志类型,如stats/monitor/access
等;logName:日志描述。这种命名的好处:通过文件名就可知道日志文件属于什么应用,什么类型,什么目的,也有利于归类查找trace/debug/info
级别的日志输出,必须进行日志级别的开关判断log4j.xml
中设置additivity=false
throws
往上抛出warn日志级别
来记录用户输入参数错误的情况,避免用户投诉时,无所适从。如非必要,请不要在此场景打出error级别
,避免频繁报警【强制】
国际化团队或海外部署的服务器由于字符集问题,使用全英文来注释和描述日志错误信息AIR原则
不准使用System.out
来进行人肉验证,必须使用assert来验证
权限控制校验
脱敏
防止SQL注入
,禁止字符串拼接SQL访问数据库有效性验证
安全过滤
或未正确转义
的用户数据CSRF安全验证
防重放
的机制,如数量限制、疲劳度控制、验证码校验,避免被滥刷而导致资损防刷
、文本内容违禁词过滤
等风控策略本文转载自公众号biggerboy