目前大部分团队是使用的阿里巴巴Java开发规范,不过在日常开发中难免遇到覆盖不到的场景,本文在阿里巴巴Java开发规范基础上,补充一些常用的规范,用于提升代码质量及增强代码可读性。

编程规约

1、基础类型及操作

(1)转换

基本类型转换

String类型转数字:使用apache common-lang3包中的工具类NumberUtils,优势:可设置默认值,转换出错时返回默认值

NumberUtils.toInt("1");

拆箱:包装类转化为基本类型的时候,需要判定null,比如:

Integer numObject = param.get(0);
int num = numObject != null ? numObject : 0;

对象类型转换

使用MapStruct工具,转换类后缀Convertor,所有转换操作都在转换类中操作,禁止在业务代码中编写大量set代码。

(2)判断

枚举判定

使用枚举判等,而非枚举对应的数字。因为枚举更直观,方便查看代码及调试,数字容易出错。

判空

各种对象的判空:

//对象判空&非空
Objects.isNull()
Objects.nonNull()//String判空&非空
StringUtils.isEmpty()   //可匹配null和空字符串
StringUtils.isNotEmpty()
StringUtils.isBlank()   //可匹配null、空字符串、多个空白字符
StringUtils.isNotBlank()//集合判空&非空
CollectionUtils.isEmpty()
CollectionUtils.isNotEmpty()//Map判空&非空
MapUtils.isEmpty()
MapUtils.isNotEmpty()

断言

使用Guava里的Preconditions工具类,比如:

//如果是空则抛异常
Preconditions.checkNotNull()
//通用判断
Preconditions.checkArgument()

2、集合处理

(1)Map快捷操作

推荐:

//如果值不存在则计算
map.computeIfAbsent("key",k-> execValue(k));
//默认值
map.getOrDefault("key", DEFAULT_VALUE)

反例:

//如果值不存在则计算
String v = map.get("key");
if(v == null){v = execValue("key");map.put("key", v);
}
//默认值
map.containsKey("key") ? map.get("key") : DEFAULT_VALUE

(2)创建对象

构造方法或Builder模式,超过3个参数对象创建使用Builder模式

//Java11+:
List.of(1, 2, 3)
Set.of(1, 2, 3)
Map.of("a", 1)//Java8中不可变集合(需引入Guava)
ImmutableList.of(1,2,3)
ImmutableSet.of(1,2,3)
ImmutableMap.of("key","value")
//多值情况
ImmutableMap.builder().put("key", "value").put("key2", "value2").build()//Java8中可变集合(需引入Guava)
Lists.newArrayList(1, 2, 3)
Sets.newHashSet(1, 2, 3)
Maps.newHashMap("key", "value")

反例:

new ArrayList<>(){{add(1);add(2);
}};

(3)集合嵌套

集合里的值如果是基础类型必须加上注释,说明集合里存的是什么,比如:

//返回值: Map(key: 姓名, value: List(商品))
Map<String, List<String>> res;

超过2层集合对象封装必须封装成自定义类:

//推荐
Map<String, List<Node>> res;@Value
public static class Node {/*** 备注说明字段*/String name;/*** 备注说明字段2*/List<Integer> subjectIds;
}//反例
Map<String, List<Pair<String, List<Integer>>>> res;

异常及日志

1、异常

关于异常及错误码的思考,请参考笔者的另一篇文章: 错误码设计思考

异常除了抛异常还有一种场景,即:上层发起多个必要调用,某些可能失败,需要上层自行决定处理策略,推荐使用vavr中的Either类,Either使用建议:通常我们使用左值表示异常,而右值表示正常调用后的返回结果,即: Either<Throwable, Data>

2、日志

(1)日志文件

根据日志等级一般分为4个日志文件即可:debug.log、info.log、warn.log、error.log;

如有特殊需求可根据场景单独建文件,比如请求日志:request.log、gc日志:gc.log等。

(2)所有用户日志都要有追踪字段

追踪字段包括:traceId、userId等,推荐使用MDC,常用的日志框架:Log4j、Logback都支持。

(3)日志清理及持久化

本地日志根据磁盘大小,必须设置日志保存天数,否则有硬盘满风险;

分布式环境为了方便查询,需要将日志采集到ES中查询;

重要日志:比如审计日志、B端操作日志需要持久保存,一般是保存到Hive中;

工具篇

1、JSON

推荐:使用Gson或Jackson;

不推荐:Fastjson。Fastjson爆出的漏洞多。

2、对象转换

推荐:MapStruct,根据注解编译成Java代码,没有反射,速度快;行为可预测,可查看编译后的Java代码查看转换逻辑;

不推荐:BeanUtils、Dozer等。需要反射,行为不可预测,需要测试;

不推荐:超过3个字段手动转换;

3、模板代码

推荐:Lombok,减少代码行数,提升开发效率,自动生成Java代码,没有性能损耗;

不推荐:手动生成大量set、get方法;

4、参数校验

推荐:hibernate Validation、spring-boot-starter-validation,可通过注解自动实现参数拦截;

不推荐:每个入口(比如Controller)都copy大量重复的校验逻辑;

5、缓存

推荐:Spring Cache,通过注解控制缓存逻辑,适合常用的加缓存场景。

设计篇

1、正向语义

正向语义的好处在于使代码容易理解。 比如: if(judge()){....} ,很容易理解,即:判定成功则执行代码块。

相反,如果是负向语义,思维还要转换一下,一般用于方法前置的参数校验。

正向语义的应用场景有:

  • 方法定义:方法名推荐:canPass、checkParam,返回true代表成功。 不推荐:比如isInvalidParam返回true代表失败,增加理解成本;
  • Lambda表达式:filter 操作符中返回true是可以通过的元素;
  • if和三目运算符: condition ? doSomething() : doSomething2() , 条件判定后紧跟的是判定成功后执行的操作。

反例:

if (!judge()) {doSomething2()
} else {doSomething()
}

2、防御式编程

(1)外部数据校验

外部传过来数据都需要校验,一般分为两类:

  • 数据流入:用户Http请求、RPC请求、MQ消费者等
  • 数据依赖:依赖的第三方RPC、数据库等

如果是数据流入,一定要首先校验数据合法性再往下执行,推荐hibernate Validation这类工具,可以很方便的做数据校验

数据是数据依赖,一定要考虑各种网络、限流、背压等场景,做好熔断、降级保障。推荐建立防腐层,将第三方的限界上下文语义转换为当前上下文语义,避免理解上的歧义;

(2)Null处理

  • 对于强依赖,没有返回值不行(比如查询数据库):直接抛异常;

  • 需要反馈给上层处理:

    (1)可能返回null的场景:使用Optional;

    (2)上层需要感知信息异常信息:使用vavr中的Either;

  • 可降级:

    (1)返回值是默认值:集合类返回,数字返回0或-1,字符串返回空字符串,其他场景自定义

    集合默认值:

Collections.emptyList()  //空List
Collections.emptySet()   //空Set
Collections.emptyMap()   //空Map

Java研发团队高效能规范相关推荐

  1. 【厚积薄发系列】读书笔记4—《伙伴教练:转化团队高效能的关键力量》小记

    1.管理理论比较:X理论.Y理论.Z理论和C理论教练式领导 X理论:命令与控制模式.自主性和创造性的缺失. 2.强调个人改变. 个人若没有改变,什么都不会发生. 3.领导的广义:经由提供方向.支持与亲 ...

  2. 软件公司如何提升效能?研发团队的北极星指标

    本文作者:汤雪 孟黎明 目录 前言 Kyligence 探索与实践 先进的技术架构--一切工作的基石 规范的研发流程--保证效率和质量 可信的指标数据--管理.追踪.改进的抓手 数字化管理工具--提升 ...

  3. 谈一谈打造高效能技术团队的七个方法

    最近在读<高效能人士的七个习惯>这本书,读了两遍,在我看来这是一本好书,但是却没有想象那么好.因为虽然书中提到的七个信条,真的都是非常精粹和正确的人生道理,但实际掌握和融合进自己信念的过程 ...

  4. 高效能团队的Java研发规范(进阶版)

    目前大部分团队是使用的阿里巴巴Java开发规范,不过在日常开发中难免遇到覆盖不到的场景,本文在阿里巴巴Java开发规范基础上,补充一些常用的规范,用于提升代码质量及增强代码可读性. 编程规约 1.基础 ...

  5. 打造高效能研发团队的 5 个关键步骤

    在互联网软件企业,今年是一个大家都在非常努力降本增效的年份,包括且不限于人员优化.人员结构优化.技术成本优化,提高人效,提升研发效能等等. 这篇文章我们从研发效能出发,尝试梳理一下打造高效能研发团队的 ...

  6. 高效能研发体系构建方案

    背景 技术管理者(技术总监/经理/CTO)都会面临公司战略执行,公司业绩的压力,以及业务对技术团队支撑能力的期望和诉求.如何打造一支快速响应,高效能,能打硬仗的技术团队?是技术管理者的挑战和必须完成的 ...

  7. 案例分享 | 戴尔 VxRail 研发团队: 效能度量如何支持成长期团队的超线性增长

    背景及需求 戴尔科技集团 VxRail 研发团队(以下简称 VxRail 团队)目前处于快速成长期,在研发效能方面主要关注如何在团队扩张的同时,使研发效率保持超线性的增长. IT 行业性质决定了 Vx ...

  8. 研发管理:怎样识别并投资高效能人才?

    本文共计2560字,建议阅读时间:5-6分钟. ‍ 阅读本文你将收获: 1.为什么高效能人才这么重要 2.如何识别高效能人才 ‍ 01 让人头痛的年终总结怎么写? ‍ 作为研发管理者,你也许已经经历过 ...

  9. 营销管理手册_麦肯锡内部培训手册,揭秘高效能团队打造的秘密,附6个案例...

    无论是一个创业型公司还是一个体系发展成熟的公司而言,其高效能核心团队对于组织发展的重要性意义是不言而喻的,如何打造一个高效能的核心团队就成为必然要求. 麦肯锡内部培训手册 很多朋友都遇到了团队人才流失 ...

最新文章

  1. 成功将BlogEngine 1.5 升级到了BlogEngine 2.0
  2. linux下压缩工具总结与使用(参考私房菜)
  3. 通过Easy-UI 树插件实现ArcGIS多个服务图层的图层控制
  4. ITK:使用地标将图像注册到另一个图像
  5. Discuz x2.5目录结构注释
  6. 如何统计JAVA网站访问次数并获得访问者IP
  7. 并发不是并行,它更好!
  8. Eclipse 汉化包下载安装
  9. 《Ray Tracing in One Weekend》——Chapter 10: Positionable camera
  10. JAVA if语句快捷键_java编程基础 第一、第二章
  11. 6.1行为型模式--模板方法模式
  12. 树莓派+ L298N 控制二相四线步进电机
  13. 【雕爷学编程】Arduino动手做(84)---DS1307时钟模块
  14. python写一个木马_Python编写简易木马程序 - 博客频道 - CSDN.NET
  15. 【0】嵌入式TCP/IP协议——————Art-Net协议详解
  16. java使用wordnet获取近义词
  17. 使用Gson序列化对象将属性值中“=”转为“\u003d”问题及解决
  18. Linux系统编程入门学习笔记5-文件IO
  19. 矩阵平方差公式成立条件的探讨
  20. u盘作为重要的计算机存储介质,U盘是采用FLASH MEMORY作为存储介质的移动存储设备...

热门文章

  1. Appium 解决不能输入中文字符问题
  2. 最新超重车辆高速动态称重系统设计方案
  3. 在Apache案例中加入模板引擎
  4. centos7-汉化vim帮助指令文档
  5. kanzi安装和入门教程
  6. C语言实现CD管理程序
  7. 基于西门子S7-1500的大型焊接机全套程序,使用博图V14打开(带全部注释,需要源程序的可以加微信x241602)...
  8. BubbleUPnP多屏互动
  9. 一、 镜头主要参数工业相机镜头的参数与选型
  10. 本地文件包含漏洞详解