仅记录一个多月实习过程的个人编码规范
API接口定义
- 统一返回格式为一个ResultBean,使用状态码对请求的状态做出响应
- ResultBean为Controller专用,不能由Service层或者Dao层上传
- 在Controller层进行aop切面,(或者使用行为参数化传递代码并用lamdba进行内部类的简化书写)对业务进行统一处理业务层异常捕获处理并返回,减少Controller的try-catch代码块统一的日志打印
异常处理
- 在service层尽量减少不必要的异常捕获与null的判断,可以抛出异常到Controller层,在AOP切面中进行统一处理
- 对具体业务异常进行统一定义,继承RuntimeException
日志处理
- 使用Facade Pattern日志框架:SLF4J
Dao与Service的抽象
- 使用模板方法对简单操作CRUD进行抽象到统一接口或者父类中,减少代码冗余
MyBatis插件
- 使用通用Mapper3简化单表CRUD操作
- 使用PageHelper简化MyBatis的翻页查询
JDK8
Optional优雅处理NullPointerException
- of
of方法通过工厂方法创建Optional实例,如果传入的值为null,会抛出异常。
// 给与一个非空值
Optional<String> username = Optional.of("lhr");
- ofNullable
与of类似,但如果传入的值为null,则返回一个空的Optional。
Optional empty = Optional.ofNullable(null);
- isPresent
如果Optional值存在返回true,否则返回false
if (user.isPresent()) {
***
}
- get
如果Optional有值则将其返回,否则抛出NoSuchElementException。
- ifPresent
如果Optional实例有值则为其调用consumer ,否则不做处理。
user.ifPresent((value) -> {
***
});
- orElse
如果有值则将其返回,否则返回指定的其它值。
System.out.println(user.orElse(new User("zhangsan")));
- orElseGet
orElseGet与orElse方法类似,区别在于得到的默认值。orElse传入的是默认值,orElseGet可以接受一个Supplier生成默认值。
System.out.println(user.orElseGet(() -> new User("zhangsan")));
- orElseThrow
如果有值则将其返回,否则抛出supplier接口创建的异常。
使用Futurn/CompletableFuture在并发的层面充分利用单一CPU,避免等待远程服务返回而浪费资源
- 在运行不需要立即获取结果的操作时,使用Future进行异步操作
- 尽量使用可超时的get获取,避免无限阻塞等待的情况