一起来学阿里巴巴Java开发手册(二)

前言

目前正在出一个阿里巴巴Java开发手册系列教程, 篇幅会较多, 喜欢的话,给个关注❤️ ~

在日常开发中,好的编码习惯和代码规范有助于提高代码可读性,提升团队协作效率,还利于维护与扩展,在某些情况下还有利于优化性能。今天就带着大家一起学习下手册中的内容,学习下Java开发中的编码规范。

好了, 废话不多说直接开整吧~

常量定义

  1. **【强制】**不允许任何魔法值(即未经预先定义的常量)直接出现在代码中。

反例:

java 复制代码
//本例中同学 A 定义了缓存的 key,然后缓存提取的同学 B 使用了 Id#taobao 来提取,少了下划线,导致故障。
String key = "Id#taobao_" + tradeId;
cache.put(key, value);
  1. **【强制】**在 long 或者 Long 赋值时,数值后使用大写的 L,不能是小写的 l,小写容易跟数字混淆,造成误解。

说明:Long a = 2l; 写的是数字的 21,还是 Long 型的 2

  1. **【推荐】**不要使用一个常量类维护所有常量,要按常量功能进行归类,分开维护。

说明:大而全的常量类,杂乱无章,使用查找功能才能定位到修改的常量,不利于理解,也不利于维护。

正例:缓存相关常量放在类 CacheConsts 下;系统配置相关常量放在类 ConfigConsts

  1. **【推荐】**常量的复用层次有五层:跨应用共享常量、应用内共享常量、子工程内共享常量、包内共享常量、类内共享常量。

1) 跨应用共享常量:放置在二方库中,通常是 client.jar 中的 constant 目录下。 2) 应用内共享常量:放置在一方库中,通常是子模块中的constant目录下。

反例:易懂变量也要统一定义成应用内共享常量,两位工程师在两个类中分别定义了"YES"的变量:

类 A 中:

java 复制代码
public static final String YES = "yes";

类 B 中:

java 复制代码
public static final String YES = "y";

A.YES.equals(B.YES),预期是 true,但实际返回为 false,导致线上问题。 3) 子工程内部共享常量:即在当前子工程的 constant 目录下。 4) 包内共享常量:即在当前包下单独的 constant 目录下。 5) 类内共享常量:直接在类内部 private static final 定义。

  1. **【推荐】**如果变量值仅在一个固定范围内变化用 enum 类型来定义。 说明:如果存在名称之外的延伸属性应使用 enum 类型,下面正例中的数字就是延伸信息,表示一年中的第几个季节。

正例:

java 复制代码
public enum SeasonEnum {
    SPRING(1), SUMMER(2), AUTUMN(3), WINTER(4);
    private int seq;

    SeasonEnum(int seq) {
        this.seq = seq;
    }

    public int getSeq() {
        return seq;
    }
}

代码格式

  1. **【强制】**如果是大括号内为空,则简洁地写成{}即可,大括号中间无需换行和空格;如果是非空代码块则: 1) 左大括号前不换行。 2) 左大括号后换行。 3) 右大括号前换行。 4) 右大括号后还有 else 等代码则不换行;表示终止的右大括号后必须换行。

  2. **【强制】**左小括号和右边相邻字符之间不出现空格;右小括号和左边相邻字符之间也不出现空格;而左大括号前需要加空格。详见第 5 条下方正例提示。 反例:

java 复制代码
if (空格 a == b 空格)
  1. 【强制】 if/for/while/switch/do 等保留字与括号之间都必须加空格。

  2. **【强制】**任何二目、三目运算符的左右两边都需要加一个空格。 说明:包括赋值运算符=、逻辑运算符&&、加减乘除符号等。

  3. **【强制】**采用 4 个空格缩进,禁止使用 tab 字符。 说明:如果使用 tab 缩进,必须设置 1 个 tab 为 4 个空格。IDEA 设置 tab 为 4 个空格时,请勿勾选 Use tab character;而在 eclipse 中,必须勾选 insert spaces for tabs。

正例:

java 复制代码
public static void main(String[] args) {
 // 缩进 4 个空格
 String say = "hello";
 // 运算符的左右必须有一个空格
 int flag = 0;
 // 关键词 if 与括号之间必须有一个空格,括号内的 f 与左括号,0 与右括号不需要空格
 if (flag == 0) {
 System.out.println(say);
 }
 // 左大括号前加空格且不换行;左大括号后换行
 if (flag == 1) {
 System.out.println("world");
 // 右大括号前换行,右大括号后有 else,不用换行
 } else {
 System.out.println("ok");
 // 在右大括号后直接结束,则必须换行
 }
}
  1. **【强制】**注释的双斜线与注释内容之间有且仅有一个空格。 正例:
java 复制代码
// 这是示例注释,请注意在双斜线之后有一个空格
String commentString = new String();
  1. **【强制】**在进行类型强制转换时,右括号与强制转换值之间不需要任何空格隔开。 正例:
java 复制代码
long first = 1000000000000L;
int second = (int)first + 2; 
  1. **【强制】**单行字符数限制不超过 120 个,超出需要换行,换行时遵循如下原则:

1)第二行相对第一行缩进 4 个空格,从第三行开始,不再继续缩进,参考示例。 2)运算符与下文一起换行。 3)方法调用的点符号与下文一起换行。 4)方法调用中的多个参数需要换行时,在逗号后进行。 5)在括号前不要换行,见反例。 正例:

java 复制代码
StringBuilder sb = new StringBuilder();
// 超过 120 个字符的情况下,换行缩进 4 个空格,并且方法前的点号一起换行
sb.append("zi").append("xin")...
 .append("huang")...
 .append("huang")...
 .append("huang");

反例:

java 复制代码
StringBuilder sb = new StringBuilder();
// 超过 120 个字符的情况下,不要在括号前换行
sb.append("you").append("are")...append
 ("lucky");
// 参数很多的方法调用可能超过 120 个字符,逗号后才是换行处
method(args1, args2, args3, ...
, argsX);
  1. **【强制】**方法参数在定义和传入时,多个参数逗号后边必须加空格。 正例:下例中实参的 args1,后边必须要有一个空格。
java 复制代码
method(args1, args2, args3); 

10.**【强制】**IDE 的text file encoding设置为 UTF-8; IDE 中文件的换行符使用 Unix 格式,不要使用 Windows 格式。

11.**【推荐】**单个方法的总行数不超过 80 行。 说明:除注释之外的方法签名、左右大括号、方法内代码、空行、回车及任何不可见字符的总行数不超过80 行。 正例:代码逻辑分清红花和绿叶,个性和共性,绿叶逻辑单独出来成为额外方法,使主干代码更加清晰;共 性逻辑抽取成为共性方法,便于复用和维护。

12.**【推荐】**没有必要增加若干空格来使变量的赋值等号与上一行对应位置的等号对齐。 正例:

java 复制代码
int one = 1;
long two = 2L;
float three = 3F;
StringBuilder sb = new StringBuilder();

说明:增加 sb 这个变量,如果需要对齐,则给 one、two、three 都要增加几个空格,在变量比较多的情况下,是非常累赘的事情。

13.**【推荐】**不同逻辑、不同语义、不同业务的代码之间插入一个空行分隔开来以提升可读性。

说明:任何情形,没有必要插入多个空行进行隔开。

结束语

下节给大家讲OOP编码规范~

本着把自己知道的都告诉大家,如果本文对有所帮助,点赞+关注鼓励一下呗~

阿里巴巴Java开发手册相关文章

MybatisPlus教程相关文章

往期Nginx教程相关文章

往期Docker教程相关文章

往前Shell脚本编程相关文章

往期Linux相关文章

往期面试题相关文章

项目源码(源码已更新 欢迎star⭐️)

往期设计模式相关文章

设计模式项目源码(源码已更新 欢迎star⭐️)

Kafka 专题学习

项目源码(源码已更新 欢迎star⭐️)

ElasticSearch 专题学习

项目源码(源码已更新 欢迎star⭐️)

往期并发编程内容推荐

推荐 SpringBoot & SpringCloud (源码已更新 欢迎star⭐️)

博客(阅读体验较佳)

相关推荐
一只叫煤球的猫5 小时前
写代码很6,面试秒变菜鸟?不卖课,面试官视角走心探讨
前端·后端·面试
bobz9656 小时前
tcp/ip 中的多路复用
后端
bobz9656 小时前
tls ingress 简单记录
后端
皮皮林5517 小时前
IDEA 源码阅读利器,你居然还不会?
java·intellij idea
你的人类朋友7 小时前
什么是OpenSSL
后端·安全·程序员
bobz9657 小时前
mcp 直接操作浏览器
后端
前端小张同学10 小时前
服务器部署 gitlab 占用空间太大怎么办,优化思路。
后端
databook10 小时前
Manim实现闪光轨迹特效
后端·python·动效
武子康11 小时前
大数据-98 Spark 从 DStream 到 Structured Streaming:Spark 实时计算的演进
大数据·后端·spark
该用户已不存在11 小时前
6个值得收藏的.NET ORM 框架
前端·后端·.net