大三下学期跟同学一起跑出来,到现在也1年多了,期间遇到了很多事,不顺心的顺心点都有,但是作为一个技术人,我觉得我学到了东西,不管高级不高级我都觉得有所收获,马上就要毕业了 现在这庆祝一下🥳
引入
相信大家刚从学校出去进入项目组,或多或少都会犯一些低级的错误,可能你以前专门背过这方面的知识,一提就知道,但是还是避免不了写代码头一热就犯错了,不知道是不是这样呢?
下面的这些内容算是比较基础的,希望大家不要嫌弃哦
工具的使用
大多数项目肯定都有很多CRUD的业务操作,或者来回相互转换
如果一不注意就有可能造成一些低级错误,又因为开发环境是容器部署,每次都得重发,所以很浪费时间,逐渐变得烦躁,下面就来说说常用的
集合相关
相信大家对Arrays这个类不陌生,在我们的业务中可能有很多场景需要生成一个list来做参数传递之类的,它有什么需要注意的?
我们看这样的代码
public static void main(String[] args){
ArrayList list = new Arrays.asList(1,2,3,4,5);
System.out.println(list.size());
list.add(6);
list.remove(1);
///
}
这段代码是运行错误的,错误在add / remove。难道Arrays.asList生成的List是一个不可变的么?我们看看源码
@SafeVarargs
@SuppressWarnings("varargs")
public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);
}
没错啊,并没有特殊的修饰符修饰啊,为啥会不能修改呢?
因为new ArrayList()是new了它重写的内部类,并不是我们以为的那个ArrayList
private static class ArrayList<E> extends AbstractList<E>
implements RandomAccess, java.io.Serializable
{
private static final long serialVersionUID = -2764017481108945198L;
private final E[] a;
ArrayList(E[] array) {
a = Objects.requireNonNull(array);
}
@Override
public int size() {
return a.length;
}
@Override
public Object[] toArray() {
return a.clone();
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
看源码就知道 它本身是不提供哪些操作集合的方法的,编译能通过,就跟多态有关了,这点大家可以思考一下
集合判空/常用操作
判空 不要再使用 .isEmpty()之类的了,集合这块new出来是不为空的,即使里面的内容为空,但它本身不是null的,这点很容易犯错
streamAPI 一些集合的操作:第一个;最后一个;计算;筛选;过滤都是很常用的操作,一定要熟练,不然项目代码很多这些API你看不懂会很难受
循环 懒省事 : 什么意思呢?
一个循环你要生成另一个集合对象,但是你觉得在循环内部每次new一个浪费性能,所以你吧这个对象放在外面了
XxxBO bo = new XxxBo();
List<T> result = list.stream.map(data -> {
bo.setXxx(data.getXxx());
}).collect(Collectors.toList())
你一定要注意,这个BO对象放在外面是否会影响到你最后结果的内容,因为有些场景/不规范的操作会导致你的result里面的对象值一摸一样,这个就是引用的问题了,我推荐你去复习一下,复现一下这种场景
工具类
每个公司的项目肯定都封装了自己的工具类,诸如判空、类型转换、日期转换、数字金额计算等等。我推荐你熟悉他们,如果觉得麻烦也可以看看一些开源的组件,我参与的dromara社区的一个开源项目 大家可能了解
Hutool 地址
他可以帮助你实现很多小的功能点,而且使用起来很方简便,大家可以了解一下
阿里开源工具Arthas
相信实习/工作的同学会遇到一些问题,又不方便本地调试测试环境,那么这个Arthas就可以很好的帮助你实现排查问题的功能
Arthas地址
推荐你配合IDEA的插件
我们下载插件后就可以选中指定行来进行监控了,把这个watch出来的命令可以粘贴到容器中,我们就可以很方便的监控到我们的方法的入参、出参以及报错信息了
高级用法可以多研究研究哦
PageHelper
为什么提这个工具呢?(因为踩坑踩多了)
这个工具可以很方便的帮助我们做分页操作,就不需要我们MySQL物理分页了,但是他有时候会出现一些诡异的SQL错误,如果你发现了一些不正常的SQL错误,你觉得没写过这种SQL那么很大可能就是它有问题了
例子:
PageHelper的ThreadLocal变量复用导致的错误
记录一次线上诡异的SQL
平常开发分页的时候,如果出现一些什么Select count(0) 两个limit
这种情况就要考虑是不是这个工具有问题了
同步数据
相信大家在实习/工作的时候都有刷老数据的需求,但是数据量很大,所以我们的师兄就会要求我们做好分页,不能一股脑的查出来一个个更新,这点大家应该都清楚,因为如果查询的数据量过大会导致MySQL内存/数据页不足压力激增也有可能导致我们的项目占用内存过大直街崩掉,这点大家都清楚。
我想说的是,我们做这种刷新数据接口的时候,一定要考虑特殊情况/人性化一点,不要一股脑进行同步,可以扩展一下维度,分段同步、分区同步、分公司同步、暂停等等考虑的要全面一点,不然有哪些同步的时候出问题了,你岂不是还要从头再来?(不要问我为啥这么熟悉,麻了)