仅记录一个多月实习过程的个人编码规范

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获取,避免无限阻塞等待的情况