JAVA代码开发规范1.命名2.基本语法3.通过

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

1. 命名

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

1.1 问题示例

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

1.2 解决方案

文件命名规范

实体 类型 命名
文件 File xxxFile
文件夹 File xxxDir
文件路径 Path xxxFilePath
文件夹路径 Path xxxDirPath
文件路径 String xxxFileStr
文件夹路径 String xxxDirStr

压缩文件命名规范

实体 类型 命名
压缩源文件夹 File sourceDir
目的压缩文件 File destZipFile
压缩源文件 File sourceFile
解压文件 File zipFile
解压文件夹 File destDir

文件对比术语规范

实体 命名 说明
摘要 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);
复制代码