Java编程规范

Java编程规范


参考SONAR编程规范

集合判空用.isEmpty()而非.size() == 0

  1. 所有集合类的isEmpty()时间复杂度都是O(1),但是某些链表集合类的.size()时间复杂度可能达到O(n)
    1
    2
    3
    4
    5
    //反例
    if(collection.size() == 0)

    //正例
    if(collection.isEmpty())

集合清空用.clear()而非.removeAll()

1
2
3
4
5
6
7
8
9
List<Stirng> list = new ArrayList<>();
list.add("Tencent");
list.add("Alibaba");

//反例
list.removeAll(list);

//正例
list.clear();

集合类初始化尽量指定大小

对于可以预知大小的集合,在初始化时应该传入初始容量,减少扩容次数

1
2
3
4
5
6
7
8
9
int[] arr = new int[]{1,2,3};   

//反例
List<Integer> list = new ArrayList<>();
Map<String, Object> map = new HashMap<>();

//正例
List<Integer> list = new ArrayLIst<>(arr.length);
Map<String, Object> map = new HashMap<>(arr.length);

通过判断是否是RandomAccess的实例,决定是否随机访问List

  • List内部可能是数组/链表,链表的随机访问效率低,尽量在List内部是数组时才通过get(int index)进行随机访问
  • 数组都是实现了RandomAccess接口的
1
2
3
4
5
6
7
8
//调用第三方服务,获取List,不确定其内部是数组还是链表
List<Integer> list = otherService.getList();
//数组是实现了RandomAccess接口的
if(list instanceof RandomAccess) {
list.get(list.size() - 1); //随机访问效率高
}else{
//迭代器访问
}

如果频繁调用.contains(),先转为Set

  • 集合类的.contains()方法时间复杂度普遍是O(N)
  • 如果在代码中频繁调用.contains(),可以先将集合转为HashSet实现,可以将时间复杂度降为O(1)
1
2
3
4
5
6
7
8
9
10
11
12
ArrayList<Integer> list = otherService.getList();

//反例
for(int i = 0; i < Integer.MAX_VALUE; i++) {
list.contains(i); //O(N)
}

//正例
Set<Integer> set = new HashSet<>(list); //转为HashSet
for(int i = 0; i < Integer.MAX_VALUE; i++) {
set.contains(i); //O(1)
}

禁止使用new BigDecimal(double)

  • 构造方法new BigDecimal(double)存在精度丢失的风险,在精确计算或值比较的场景可能导致业务逻辑异常
  • 应该使用BigDecimal.valueOf(double);
1
2
3
4
5
6
7
//反例
BigDecimal value = new BigDecimal(1.1D);
//1.100000000000000088817841970012523233890533447265625

//正例
BigDecimal value = BigDecimal.valueOf(1.1D);
//1.1

其他

  1. 工具类应该私有化构造函数
  2. 共有静态常量应该通过类访问
  3. 使用String.valueOf(v)代替"" + v
  4. String.split(String regex)传入的是正则表达式,如果想根据.|/[]()进行分割,则必须进行转义:\\.

以下内容来自《阿里巴巴Java开发手册》

命名风格

  1. boolean类型的变量不要用is开头,否则部分框架可能解析错误。
  2. 接口类中的方法和属性不要加任何修饰符,保持代码的简洁

Service/DAO层方法命名规则

  1. 获取单个对象的方法用get作前缀
  2. 获取多个对象的方法用list作前缀
  3. 获取统计值的方法用count作前缀
  4. 插入的方法用insert/save作前缀
  5. 删除的方法用remove/delete作前缀
  6. 修改的方法用update作前缀

领域命名规则

  1. 数据对象:xxxDOxxx为数据库表名
  2. 数据传输对象:xxxDTOxxx为业务领域相关名称
  3. 展示对象:xxxVOxxx为网页名
  4. POJODO/DTO/BO/VO的统称,禁止命名成xxxPOJO

常量定义

  1. 不允许任何类型的魔法值(即未经定义的常量):
1
2
3
4
5
6
7
8
//反例
String key = "Id#taobao_" + tradeId;
cache.put(key, value);

//正例
final String PREFIX = "Id#taobao_";
String key = PREFIX + tradeId;
cache.put(key, value);
  1. long/Long赋初值是用大写的L,而非小写的l,防止和数字1混淆;
  2. 不要使用一个常量类维护所有常量,按照功能进行分类,便于维护;

代码格式

  1. 运算符和下文一起换行
  2. 方法调用的.符号和下文一起换行:
1
2
3
4
StringBuffer sb = new StringBuffer();
sb.append("wo")
.append(" zhenshi")
.append(" sb");
  1. 方法调用时多个参数需要换行时,在,后进行,即,不换行:
1
2
3
4
5
void fun(int a, String b, boolean c,
char d, long e, double f) {}

fun(a, b, c,
d, e, f);

OOP规范

  1. 避免通过一个类的对象来调用static对象/static方法,无谓增加了编译器解析成本,直接用类调用即可
  2. 所有重载方法必须要加@Override,这样可以在编译期就验证是否重载成功

并发处理

  1. 高并发时能用无锁就不要用锁;能锁区块就不要锁方法;能用对象锁,就不要锁方法
  2. 不要在锁代码中调用RPC
  3. 如果每次访问冲突概率小于20%,推荐使用乐观锁,否则使用悲观锁。乐观锁重试次数不得小于3
  4. 并发情况下,通过双重检查锁实现延迟初始化的优化隐患问题
1
2
3
4
5
6
7
8
//保证变量是volatile的
private volatile Helper helper;
if(helper == null){
synchronized(this){
//第二次检查
if(helper == null) return new Helper();
}
}

安全规约

  1. 隶属用户个人的页面或者功能必须要进行权限控制校验,防止没有做水平校验就可以随意访问、修改、删除别人的数据
  2. 用户输入的SQL参数必须要严格使用参数绑定或者METADATA字段值限定,防止SQL注入,禁止字符串拼接访问数据库
  3. 用户传入的任何参数都要进行有效性校验,防止:page size过大导致OOM、恶意ORDER BY导致数据库慢查询、任意重定向、SQL注入、反序列化注入……
  4. 在使用平台资源,譬如短信、邮件、电话、下单、支付,必须要实现正确的防重限制,避免恶意刷这些功能,影响平台其他用户的正常使用
  5. 发帖、评论、发送即时消息等用户生成的内容必须要实现防刷、文本内容违禁词过滤等风控策略

MySQl建表规约

  1. 表名、字段名尽量全小写!因为MySQLWindows下不区分大小写,但是在Linux下区分大小写
  2. 主键索引命名pk_字段名;唯一索引命名uk_字段名;普通索引命名idx_字段名
  3. 小数类型为decimal,禁止使用floatdouble,防止精度丢失
  4. 库名和应用名最好一致
  5. 单表行数超过500w,或者数据超过2GB,才推荐进行分库分表,如果预计3年后数据量达不到这个级别,就不要在创建表的时候就分库分表!!!
-------------本文结束感谢您的阅读-------------

本文标题:Java编程规范

文章作者:DragonBaby308

发布时间:2019年09月15日 - 21:53

最后更新:2020年01月30日 - 16:33

原始链接:http://www.dragonbaby308.com/coding-standard/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

急事可以使用右下角的DaoVoice,我绑定了微信会立即回复,否则还是推荐Valine留言喔( ఠൠఠ )ノ
0%