JAVA代码开发规范

1,228 阅读3分钟

规范如果太严会限制程序员的创新,规范如果没有,会写出的代码五花八门,本文尝试从个人代码的体验来说说那些应该作为规范,哪些不适合强制。

1. 命名

命名是最重要的规范,但给出比如驼峰命名是远远不够的,需要对程序中用到的「业务术语」和「技术术语」进行约束。

1.1 问题示例

比如,在「文件备份程序」GitHub地址的开发过程中,我经常要用到各种文件命名(文件夹路径字符串,文件夹路径对象,文件夹文件对象,文件路径字符串,文件路径对象,文件的文件对象,压缩的源文件夹<字符串,文件对象,路径对象>,压缩的目标文件.....),不同时期,不同的类,命名完全不同,代码很难阅读。(有的File结尾的表示字符串,有的表示文件对象;Path结尾的有时候表示字符串,有时候表示Path对象),代码一度阅读涉及文件的操作,都很费劲。

1.2 解决方案

文件命名规范

实体类型命名
文件FilexxxFile
文件夹FilexxxDir
文件路径PathxxxFilePath
文件夹路径PathxxxDirPath
文件路径StringxxxFileStr
文件夹路径StringxxxDirStr

压缩文件命名规范

实体类型命名
压缩源文件夹FilesourceDir
目的压缩文件FiledestZipFile
压缩源文件FilesourceFile
解压文件FilezipFile
解压文件夹FiledestDir

文件对比术语规范

实体命名说明
摘要digest计算文件是否变更,目前通过MD5或文件长度
版本version对文件夹整体生成摘要文件,统一的摘要文件,可以称为文件的一个版本。

2. 基本语法

2.1 控制语句

  • 优先选择用Stream ,forEach简化写法

  • 如果需要访问非final,使用普通循环写法

2.1类与record

  • 【推荐】优先选用record表示值对象或简单实体,业务复杂对象使用Class设计为实体,包含业务操作

2.2 接口

  • 【推荐】无不同实现可以不选用接口
  • 【强制】有不同实现选用接口

3. 通过新版JDK获取更强的代码的表现力

代码的表现力,是指在不影响阅读的前提下,代码越短越好。

先对比先两段代码,你觉得哪个更好?

List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(5);
list.add(3);

VS

var list = List.of(1, 5, 3);

可以明显感觉到,下面一种写法不仅代码量更少,也更容易阅读。我们应该选择不影响阅读体验的条件下,尽可能短的代码。随着java新语法的推进,语言的表现力也在增强,下面列举一些表现力更强的写法: 弱类型定义 var的语法,局部变量不用类型也是表达的增强,根据上下文可以很方便的阅读类型。

3.1 lamda

List<String> list = map.get("key");
if (list == null) {
    list = new ArrayList<>();
}

VS

List<String> list = map.computeIfAbsent("key", key -> new ArrayList<>());

lamda可以方便的把处理过程作为参数传递,可以很方便的实现「模板方法」设计模式。重用函数的执行骨架,协调调度传入的lamda过程。

3.2 流-lamda增强集合

jdk8开始支持的流其实是结合lamda做的一些语法糖。对集合常见操作比如遍历,map和reduce运算,提供了lamda支持。对集合的操作以前你关心怎么做,现在只需要关心做什么。

List<String> names = new ArrayList<>();
for (User user : users) {
    names.add(user.getName());
}

VS

List<String> names = users.stream().map(user -> user.name).collect(Collectors.toList());

3.3 链式写法

链式写法省略了重复的主语,表达力更强。

var article = new Article(1L, "testUser");
article.setTitle("title");
article.setContent("content");
article.setOrderNum(100);

VS

var article = new Article(1L, "testUser").setTitle("title").setContent("content").setOrderNum(100);