JAVA代码规范
项目命名:project-task
1、结构命名:
类—结尾处表明 Service \ PO\ Mapper\ xxxFactory
方法—头处表明:get list remove modify count
2、不要有魔法值,要自己定义 常量类,如—CacheConsts
2.1 一般定义 interface 接口,其中定义常量 默认为 public final static
3.1 命名规则,一般为大写+下划线命名
String DB_NAME = "local";
3、Object类之间的比较,使用Objects.equals
4、包装类比较全部使用equals 包括Integer
5、POJO中的类型强制使用包装类(int—>integer)
POJO类中不要设置任何默认值
6、【强制】不要在 foreach 循环里进行元素的 remove/add 操作。remove 元素请使用 Iterator
方式,如果并发操作,需要对 Iterator 对象加锁。
如:
List list = new ArrayList<>();
list.add("1");
list.add("2");
Iterator iterator = list.iterator();
while (iterator.hasNext()) {
String item = iterator.next();
if (删除元素的条件) {
iterator.remove();
}
}
- 使用HashMap推荐 初始设置init值,如果不确定需要用到多少推荐16 new HashMap(16);
- 如果是 JDK8 的应用,可以使用 Instant 代替 Date,LocalDateTime 代替 Calendar,
DateTimeFormatter 代替 SimpleDateFormat,官方给出的解释:simple beautiful strong
immutable thread-safe。 - if(){}else{} 一定要避免3层,过高推荐其他方式。
注释规范
类、类属性、类方法必须使用/** **/ 枚举必须要有注释
接口规范
遵守restful风格
声明:@RequestMapping(“/pc/commodity”) == @RequestMapping(“pc/commodity”),两种写发是一致的,容器默认在启动时候,没有/ 路径会自动加上
类接口路径
@RestController
@RequestMapping("/pc/commodity")
public class CommodityController {
}
1、Get 单条推荐直接路径接参
@GetMapping("{id}")
public ResultResponse<CommodityVO> get(@PathVariable Long id) {
return new ResultResponse<>(commodityService.get(id));
}
//多条
@GetMapping("list")
public ResultResponse<PageInfo<CommodityVO>> list(CommodityQuery query) {
PageInfo<CommodityVO> commodityPage = commodityService.list(query);
return new ResultResponse<>(commodityPage);
}
2、Post body传参,隐式传参
@PostMapping
public ResultResponse<?> save(@RequestBody CommodityForm form) {
commodityService.save(form);
return ResultResponse.SUCCESS;
}
3、Put
@PutMapping("{id}")
public ResultResponse<?> edit(@RequestBody CommodityForm form, @PathVariable Long id) {
commodityService.edit(id, form);
return ResultResponse.SUCCESS;
}
4、Delete 推荐直接路径接参
@DeleteMapping("{id}")
public ResultResponse<?> remove(@PathVariable Long id) {
commodityService.removeById(id);
return ResultResponse.SUCCESS;
}
5、其他接口,多个不可分割的单词,使用中划线拼接
@PostMapping("commodity/check-code")
public ResultResponse<PageInfo<CommodityVO>> checkCode(@RequestBody CommodityQuery query){
PageInfo<CommodityVO> commodityPage = commodityService.list(query);
return new ResultResponse<>(commodityPage);
}
异常处理
NEP 防止NEP出现,方法体返回要注意判空 如 return Integer. Integer为Null 就会出现NEP 推荐使用Optional
1、try之后 不会异常回滚,注意手动!!!
2、异常不要全局的Excpetion要局部
3、异常要注意将报错信息和报错的对象打印出来。 log.error(e.getMessage(),e);
Mysql 规范
必备字段:id—bigint;gmt_create—datetime;gmt_update—datetime;flag—tinyint
表:业务_作用;apply_task
库:名字尽量和服务名一致
【推荐】:字段为了方便可以冗余一些,根据逻辑需要(不要太死板因为一个字段再去查询另一张表)
1、表示 是否的使用unsigned tinyint(1是0否) 推荐是is_xxx 但是这样就需要java进行转换,一般使用delete_flag
2、mysql中禁止出现任何大写,命名,不得使用复数命名
3、索引命名 主键索引名为 pk_字段名;唯一索引名为 uk_字段名;普通索引名则为 idx_字段名。
说明:pk_ 即 primary key;uk_ 即 unique key;idx_ 即 index 的简称。
4、小数类型使用decimal,可变串 varchar 不要过5000,如过长使用text
count() 和count(1)没有区别,官方也推荐了count().。 count(列名)不会统计null的。
count(列) 如果都null会返回 0,但是sum(列)都是null 会返回null,这时候就要注意NPE.
可以使用:SELECT IF(ISNULL(SUM(g)),0,SUM(g)) FROM table;
【强制】不要使用 = <>来比较可能为null的值。 因为Null值与其他任何值都会返回NULL
5、utf-8一般足够使用,utf-8mb4是一种扩展,如果存储表情再使用