本文将总结我2021年1月,第一次实习过程中,在项目开发遇到的编程规范问题或者平时未有注意的规范问题,以及list出一些编程技巧等等,不定期更新,觉得有用建议收藏,欢迎品论区补充,我将一起整理到文章中,共勉!
1. 把字符串常量放在前面
“string_constant”.equals(str),避免str出现空指针异常,不过企业中项目都会有工具类可以直接调用,也有引入的第三方包,常见如hutool工具包等等。
2.比较两个BigDecimal对象时,compareTo方法只比较值是否相等,返回值是int类型;equals方法对值与精度都进行比较,都相等返回true,否则返回false。
3.涉及金额等精确浮点计算的数据类型必须用BigDecimal,float、double类型会丢失精度禁止使用。
4.不能使用过时的类或方法。接口过时必须加@Deprecated注解,并清晰地说明采用的新接口或者新服务是什么。
5.所有的相同类型的包装类对象之间值的比较,必须使用equals方法比较。基本类型与其包装类对象比较,要么把包装类转为基本类型使用==比较,要么把基本类型转为包装类型对象后使用equals方法比较。
6.Object的equals方法容易抛空指针异常,应使用常量或确定有值的对象来调用equals,建议使用以下方法:Objects.equals(a, b) 或者 ObjectUtil.equal(a, b)、ObjectUtil.notEqual(a, b);
7.集合初始化时,指定集合初始值大小。 说明:HashMap使用如下构造方法进行初始化,如果暂时无法确定集合大小,那么指定默认值(16)即可。
1)、List评估大小:List<String> list = new ArrayList<>(2);
2)、Map评估大小:Map<String, Object> paramMap = MapUtil.newHashMap(2);
3)、避免字符串拼,使用StringBuider并评估大小,或者使用StrUtil.concat 或者 StringUtils.concat:
StringBuilder builder = new StringBuilder(30);
String log = StrUtil.concat(true, “a”, “b”, “c”);
8.使用DTO,避免使用Map或者JSONObject传递参数(包括方法的参数传递);
9.获取当前毫秒数:System.currentTimeMillis(); 而不是new Date().getTime();
10.避免用Apache Beanutils进行属性的copy。Apache BeanUtils性能较差,可以使用其他方案比如Spring的BeanUtils,Hutool的BeanUtil。
11.建议直接跳转此链接,比较详细链接在此
12.企业代码很讨厌if..else,这里我看过一篇很好的文章,启发很大,推荐给大家,链接在此,还有一个方法不要超过80行代码,
13.自己的需求写完后,一定要在本地自测一下响应速度,超过1200ms的接口(看公司规定)都属于慢接口,这是个很严重的问题,可以通过公司的全链路监控以及日志系统看一下该请求链路下经过的每个方法的执行时间,以及在哪个sql耗时最严重,可能要优化sql(强烈建议看我的这篇文章)
14.微服务中,在前后端直接接触的那一层Controller尽量用对象去接受,实习时候因为要接受前端一个数组类型的参数,在controller里面写一个方法名(@Param(“idList”)List idList)去接受,结果联调时候报错了,总归是太懒了。所以还是要养成习惯将请求写到实体类里面去接收,除非只是基本类型的包装类或者只有一个String类型的参数,这个就没必要专门写实体类了。还有服务与服务之间的调用千万不要忘记携带@RequestBody/@Param等这些注解,我比较粗心,进场会漏,还有一次自己封装一个SDK,在其他微服务调用需要写配置类将sdk的bean注入到容器,结果忘记加@Configuration,找了一会的bug。
15.千万千万要记得写日志,要有一种如果会出现bug该从日志看断点的思维,在调用其他微服务时候,习惯将要穿的参数进行日志打印,服务调用返回结果进行日志打印,断言语句也一样,可以用于判断服务返回结果是否正常,用调试会在哪打断点的思维去写日志,日志真的很重要。
16.减少微服务的调用次数,不要懒惰,开发精神就是为了提高系统的性能,如果传一个数组能解决一次性返回所需要的数据,就不要写for循环多次调用服务来获取结果,不仅会增加http的开销,这段代码也是属于垃圾代码。但是也有例外,例如之前遇到过一个需求是要联表查库将一堆数据导出到excel中,公司的大佬很厉害,用例设计模式已经封装好了接口方法,避免了重复造轮子。因为用了mq异步处理导出,并且如果一次性导出几十万的数据,一定也会出问题,所以这个方法用递归每次获取固定的几百条数据写入excel。