1、局部变量尽量使用基本数据类型。
2、MyBatisPlus的QueryWrapper对象因程序跨行使用,不用重复new对象,直接调用clear()方法清除之前的条件。
3、当程序中调用“尽量调用时”,重新开个线程,不要影响主线程的性能。
// 主线程。。。。
ThreadUtil.execute(() -> {
});
// 主线程。。。。
4、循环中避免定义对象的引用,比如
// 不推荐写法
for(int i=0;i<10;i++) {
User user = new User();
}
// 推荐写法
User user;
for(int i = 0;i<10;i++) {
user = new User();
}
5、避免给前端直接返回NULL。像String就算是空,是"",空字符串。List是[]。。。。。。
6、所有的String对象尽量判断是否为NULL,推荐
StringUtils.isNotBlank();
再去使用它。
7、看代码
if(user != null) {}
if(null != user) {}
向老程序员致敬,哈哈
8、账号锁定实现之一
Integer pwdOverFlagName = (Integer)redisStringUtil.get("pwdOverFlag" + name);
if(pwdOverFlagName == null) {
redisStringUtil.set("pwdOverFlag" + name,0);
pwdOverFlagName = 0;
}else {
// 这有个坑,嘻嘻
if(pwdOverFlagName > 3) {
redisStringUtil.setEx("pwdOverFlag" + name,4,10,TimeUnit.MINUTES);
throw new BusinessException(BusinessEnum.BUSINESS_1005);
}
}
Integer charCode = (Integer) redisStringUtil.get(code.toString());
if(charCode == null) {
throw new BusinessException(BusinessEnum.BUSINESS_1002);
}
// 业务代码...
if(密码正确条件){
redisStringUtil.set("pwdOverFlag" + name,0);
}else {
redisStringUtil.setEx(code + "",code,1,TimeUnit.MILLISECONDS);
pwdOverFlagName += 1;
redisStringUtil.set("pwdOverFlag" + name,pwdOverFlagName);
throw new BusinessException(BusinessEnum.BUSINESS_1004);
}
}else {
throw new BusinessException(BusinessEnum.BUSINESS_1003);
}
说一下那个坑。
场景是这样,虽然一个账号被锁了10分钟,但是有个不好的地方就是,用户点击一次该账号的解锁时间会被再次锁定10分钟,假如我的账号被锁了10分钟,我知道10分钟后会解锁,但是有些用户没等到10分钟就再次点了一次,虽然显示10分钟后再试,但是账号的解锁时间被重新设置为10分钟。
解决办法:
if(pwdOverFlagName > 3) {
Long expire = redisTemplate.getExpire("pwdOverFlag" + userName);
if(expire == -1) {
redisStringUtil.setEx("pwdOverFlag" + userName,4,10, TimeUnit.MINUTES);
}
throw new BusinessException(BusinessEnum.BUSINESS_1005);
}
9、容器尽量指定初始大小。
List<String> list = new ArrayList<>(16);
// .......
10、字符串等于判断
String str;
// 不推荐,如果str为NULL呢??嘻嘻
if(str.equals("1")) {
str= null;
}
// 推荐,避免空指针带来的异常
if("1".equals(str)) {
str= null;
}
11、List去重
// strs去重
List<String> list = strs.stream().distinct().collect(Collectors.toList());
12、forEach不能进入DEBUG。哈哈哈
13、MyBatisPlus分页对象后,操作里面的对象。
Page<User> page = userMapper.page(new Page<>(current,size));
page.getRecords().stream().forEach(data ->{
// 对data处理
//.....
}
14、