java开发规约

编码规约

命名规约

  1. 【强制】类名使用UpperCamelCase风格,以下情形例外:DO / BO / DTO / VO / AO / UID等。
    正例:ForceCode / UserDO / HtmlDTO / XmlService / TcpUdpDeal / TaPromotion
    反例:forcecode / UserDo / HTMLDto / XMLService / TCPUDPDeal / TAPromotion
  2. 【强制】常量命名应该全部大写,单词间用下划线隔开,力求语义表达完整清楚,不要嫌名字长。
    正例:MAX_STOCK_COUNT / CACHE_EXPIRED_TIME
    反例:MAX_COUNT / EXPIRED_TIME
  3. 【强制】抽象类命名使用Abstract或Base开头;异常类命名使用Exception结尾;测试类命名以它要测试的类名开始,以Test结尾。
  4. 【强制】POJO类中的任何布尔类型的变量,都不要加is前缀,否则部分框架解析会引起序列化错误。
    说明:在本文MySQL规约中的建表约定第一条,表达是与否的变量采用is_xxx的命名方式,所以,需要在设置从is_xxx到xxx的映射关系。
    反例:定义为Boolean isDeleted 的属性,它的方法也是isDeleted(),框架在反向解析的时候,“误以为”对应的属性名称是deleted,导致属性获取不到,进而抛出异常
  5. 【强制】包名统一使用小写,点分隔符之间有且仅有一个自然语义的英语单词。包名统一使用单数形式,但是类名如果有复数含义,类名可以使用复数形式。
    正例:应用工具类包名为com.alibaba.ei.kunlun.aap.util;类名为MessageUtils(此规则参考spring的框架结构)
  6. 【强制】杜绝完全不规范的缩写,本规约认可的缩写请参考附2。
    反例:<某业务代码>AbstractClass“缩写”成AbsClass;condition“缩写”成 condi,Function“缩写”成Fu, 此类随意缩写严重降低了代码的可阅读性
  7. 【推荐】如果模块、接口、类、方法使用了设计模式,在命名时体现出具体模式。
    说明:将设计模式体现在名字中,有利于阅读者快速理解架构设计思想。
    正例:public class OrderFactory;
        public class LoginProxy;
        public class ResourceObserver;
  8. 【推荐】接口类中的方法和属性不要加任何修饰符号(public 也不要加),保持代码的简洁性,并加上有效的javadoc注释。尽量不要在接口里定义变量,如果一定要定义变量,确定与接口方法相关,并且是整个应用的基础常量。
    正例:接口方法签名:void commit();
        接口基础常量表示:String COMPANY = “alibaba”;
    反例:接口方法定义:public abstract void commit();
    说明:JDK8中接口允许有默认实现,那么这个default方法,是对所有实现类都有价值的默认实现
  9. 【参考】各层命名规约:
    A) Service/DAO层方法命名规约
    1) 获取单个对象的方法用get作前缀。
    2) 获取多个对象的方法用list作前缀,复数结尾,如:listObjects。
    3) 获取统计值的方法用count作前缀。
    4) 插入的方法用save/insert作前缀。
    5) 删除的方法用remove/delete作前缀。
    6) 修改的方法用update作前缀。
    B) 领域模型命名规约
    1) 数据对象:xxxDO,xxx即为数据表名。
    2) 数据传输对象:xxxDTO,xxx为业务领域相关的名称。
    3) 展示对象:xxxVO,xxx一般为网页名称。
    4) POJO是DO/DTO/BO/VO的统称,禁止命名成xxxPOJO

常量定义

  1. 【强制】不允许任何魔法值(即未经预先定义的常量)直接出现在代码中。
    反例:String key = “Id#taobao_” + tradeId;
        cache.put(key, value);
      本例中同学A定义了缓存的key,然后同学B使用缓存时少了下划线,即key是"Id#taobao"+tradeId,导致故障。
  2. 【强制】在 long 或者 Long 赋值时,数值后使用大写的 L,不能是小写的 l,小写容易跟数字混淆,造成误解。
    说明:Long a = 2l; 写的是数字的21,还是Long型的2?
  3. 【推荐】不要使用一个常量类维护所有常量,要按常量功能进行归类,分开维护。
    正例:缓存相关的常量放在类CacheConsts下;系统配置相关的常量放在类SystemConfigConsts下。
    说明:大而全的常量类,杂乱无章,使用查找功能才能定位到修改的常量,不利于理解,也不利于维护。

格式

  1. 【强制】任何二目、三目运算符的左右两边都必须加一个空格。
    说明:包括赋值运算符=、逻辑运算符&&、加减乘除符号等
  2. 【推荐】单个方法的总行数不超过80行。
    说明:除注释之外的方法签名、左右大括号、方法内代码、空行、回车及任何不可见字符的总行数不超过80行。
    正例:代码逻辑分清红花和绿叶,个性和共性,绿叶逻辑单独出来成为额外方法,使主干代码更加清晰;共性逻辑抽取成为共性方法,便于复用和维护。
  3. 【强制】所有整型包装类对象之间值的比较,全部使用equals方法比较。
    说明:对于Integer var=某个数字,但在-128至127之间的赋值,Integer对象是在IntegerCache.cache产生,会复用已有对象。虽然这个区间内的Integer值可以直接使用==进行判断,但是这个区间之外的所有数据,都会在堆上产生,并不会复用已有对象,这是一个大坑,推荐使用equals方法进行判断。
  4. 强制】浮点数之间的等值判断,基本数据类型不能用==来比较,包装数据类型不能用equals来判断。
    说明:浮点数采用“尾数+阶码”的编码方式,类似于科学计数法的“有效数字+指数”的表示方式。二进制无法精确表示大部分的十进制小数
float a = 1.0f - 0.9f;
float b = 0.9f - 0.8f;

if (a == b) {
    // 预期进入此代码块,执行其它业务逻辑
    // 但是 a==b 的结果为false
}

Float x = Float.valueOf(a);
Float y = Float.valueOf(b);
if (x.equals(y)) {
    // 预期进入此代码块,执行其它业务逻辑
    // 但是 x.equals(y) 的结果为false
}  
//这里可以用BigDecimal来比较
  1. 【强制】禁止使用构造方法BigDecimal(double)的方式把double值转化为BigDecimal对象。
    说明:BigDecimal(double)存在精度损失风险,在精确计算或值比较的场景中可能会导致业务逻辑异常。如:BigDecimal g = new BigDecimal(0.1f); 实际的存储值为:0.100000001490116119384765625
    正例:优先推荐入参为String的构造方法,或使用BigDecimal的valueOf方法,此方法内部其实执行了Double的toString,而Double的toString按double的实际能表达的精度对尾数进行了截断。
BigDecimal recommend1 = new BigDecimal("0.1");
BigDecimal recommend2 = BigDecimal.valueOf(0.1);
  1. 【强制】构造方法里面禁止加入任何业务逻辑,如果有初始化逻辑,请放在init方法中

  2. 【强制】POJO类必须写toString方法。使用工具类source> generate toString时,如果继承了另一个POJO类,注意在前面加一下super.toString。
    说明:在方法执行抛出异常时,可以直接调用POJO的toString()方法打印其属性值,便于排查问题

  3. 【推荐】类内方法定义顺序依次是:公有方法或保护方法 > 私有方法 > getter/setter方法。
    说明:公有方法是类的调用者和维护者最关心的方法,首屏展示最好;保护方法虽然只是子类关心,也可能是“模板设计模式”下的核心方法;而私有方法外部一般不需要特别关心,是一个黑盒实现;因为承载的信息价值较低,所有Service和DAO的getter/setter方法放在类体最后

  4. 【推荐】setter方法中,参数名称与类成员变量名称一致,this.成员名=参数名。在getter/setter方法中,尽量不要增加业务逻辑,增加排查问题难度

  5. 【推荐】慎用Object的clone方法来拷贝对象。
    说明:对象的clone方法默认是浅拷贝,若想实现深拷贝需要覆写clone方法实现域对象的深度遍历式拷贝

  6. 【强制】日期格式化时,传入pattern中表示年份统一使用小写的y。
    说明:日期格式化时,yyyy表示当天所在的年,而大写的YYYY代表是week in which year(JDK7之后引入的概念),意思是当天所在的周属于的年份,一周从周日开始,周六结束,只要本周跨年,返回的YYYY就是下一年。
    正例:表示日期和时间的格式如下所示:
    new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss”);
    反例:某业务因使用YYYY/MM/dd进行日期格式化,2017/12/31执行结果为2018/12/31,导致P4P广告在2017年12月31日当日实时消耗跌0,造成P2故障

  7. 【强制】在日期格式中分清楚大写的M和小写的m,大写的H和小写的h分别指代的意义。
    说明:日期格式中的这两对字母表意如下:
    表示月份是大写的M;
    表示分钟则是小写的m;
    24小时制的是大写的H;
    12小时制的则是小写的h

  8. List item

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值