Java阿里巴巴代码规范

2023-10-27

目录


1 编程规约

我们介绍了让代码规范的方案,下面我们就来说一下阿里的代码规范文档

在这里插入图片描述

	业界公认的代码规范手册(国内)当属阿里巴巴旗下出版的《Java 开发手册》,经过几个版本的迭代,最新手册为《Java 开发手册》,更新时间为2022年2月3号。

	手册以 Java 开发者为中心视角,划分为编程规约、异常日志、 单元测试、 安全规约、 MySQL 数据库、 工程结构、 设计规约七个维度,再根据内容特征,细分成若干二级子目录。根据约束力强弱及故障敏感性,规约依次分为强制、推荐、参考三大类。对于规约条目的延伸信息中,“说明” 对规约做了适当扩展和解释;“正例” 提倡什么样的编码和实现方式;“反例”说明需要提防的雷区, 以及真实的错误案例。

1.1 方法参数类型必须一致,不要出现自动装箱拆箱操作

1.1.1 反例

这种操作很容易产生难以排查的NPE异常

/**
  * 反例
  * 容易出现空指针异常,如果参数为null就会拆箱失败空指针错误
  * 排查的时候很难排查,因为直接看代码看起来不会出现空指针的。
  * @param value
  * @return
  */
public static int handel(Integer value) {
    return value;
}

1.1.2 正例

入参以及出参,和参数传递类型是一致的

public static Integer handel(Integer value) {
    return value;
}

1.2 SimpleDateFormat是线程不安全的

SimpleDateFormat 是线程不安全的类,一般不要定义为 static 变量,如果定义为 static, 必须加锁,或者使用 DateUtils 工具类

1.2.1 反例

使用这种方式在多线程的情况下会报错,或者出现数据不一致的情况

private static final SimpleDateFormat dateFormate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

在这里插入图片描述

1.2.2 正例

使用ThreadLocal的方式保证线程安全,或者使用DateTimeFormatter代替SimpleDateFormat

private static final ThreadLocal<SimpleDateFormat> threadLocal = new ThreadLocal<SimpleDateFormat>() {
    @Override
    protected SimpleDateFormat initialValue() {
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    }
};

1.3 使用equals方法应该注意空指针

1.3.1 反例

如果object为null就会抛出NPE异常

object.equals("test");

1.3.2 正例

应该使用常量或者确定的值来进行判断equals

"test".equals(object);

或者使用Objects.equals

 Objects.equals(object1,object2)

2 异常日志

2.1 事务场景中如果异常被被捕获要注意回滚

2.1.1 反例

@Service
@Transactional(rollbackFor = Exception.class)
public class UserServiceImpl implements UserService {
    @Override
    public void save(User user) {
        try{
        //some code
        //db operation
        }catche(Exception e){
            
        }
    }
}   

2.1.2 正例

@Service
@Transactional(rollbackFor = Exception.class)
public class UserServiceImpl implements UserService {
    @Override
    public void save(User user) {
        try{
        //some code
        //db operation
        }catche(Exception e){
            //捕获处理后需要再将异常抛出
            throw  e;
        }
    }
}   

2.2 不要在 finally 块中使用 return

try 块中的 return 语句执行成功后,并不马上返回,而是继续执行 finally 块中的语句,如果此处存 在 return 语句,则在此直接返回,无情丢弃掉 try 块中的返回点。

2.2.1 反例

这种情况下结果永远返回的都是true,fanally中不要做返回操作

public static boolean getValue(String text) {
    try {
        return text.equals("123");
    } finally {
        return true;
    }
}

2.2.2 正例

public static boolean getValue(String text) {
    return "123".equals(text);
}

2.3 应用中不可直接使用日志系统(Log4j、Logback)中的 API

在Java生态体系中,围绕着日志,有很多成熟的解决方案,关于日志输出,主要有两类工具。

	一类是日志框架,主要用来进行日志的输出的,比如输出到哪个文件,日志格式如何等,另外一类是日志门面,主要一套通用的API,用来屏蔽各个日志框架之间的差异的。

	所以,对于Java工程师来说,关于日志工具的使用,最佳实践就是在应用中使用如Log4j + SLF4J 这样的组合来进行日志输出。

	这样做的最大好处,就是业务层的开发不需要关心底层日志框架的实现及细节,在编码的时候也不需要考虑日后更换框架所带来的成本,这也是门面模式所带来的好处。

	请不要在你的Java代码中出现任何Log4j等日志框架的API的使用,而是应该直接使用SLF4J这种日志门面。

2.4 所有日志文件至少保存15天

	所有日志文件至少保存15天,因为有些异常具备以“周”为频次发生的特点,网络运行状态、安全相关信息、系统监测、管理后台操作、用户敏感操作需要留存相关的网络日志**不少于6个月**。

3 单元测试

3.1 好的单元测试必须遵守 AIR 原则

	单元测试在线上运行时,感觉像空气(AIR)一样并不存在,但在测试质量的保障上,却是非常关键的,好的单元测试宏观上来说,具有自动化、独立性、可重复执行的特点。

3.2 单元测试应该是全自动执行的,并且非交互式的

  • 测试用例通常是被定期执行的,执行过程必须完全自动化才有意义。
  • 输出结果需要人工检查的测试不是一个好的单元测试。
  • 单元测试中不准使用System.out来进行人肉验证,必须使用assert来验证。

3.3 单元测试是可以重复执行的,不能受到外界环境的影响

	单元测试通常会被放到持续集成中,每次有代码check in时单元测试都会被执行,如果单测对外部环境(网络、服务、中间件等)有依赖,容易导致持续集成机制的不可用,为了不受外界环境影响,要求设计代码时就把SUT的依赖改成注入,在测试时用spring 这样的DI框架注入一个本地(内存)实现或者Mock实现。

4 安全规约

4.1 用户敏感数据禁止直接展示,必须对展示数据进行脱敏

	中国大陆个人手机号码显示为:`137****0969`,隐藏中间 4 位,防止隐私泄露,以及用户的身份证号码,银行卡号码,用户姓名等都需要进行脱敏处理

4.2 用户请求传入的任何参数必须做有效性验证

说明:忽略参数校验可能导致:

  • page size 过大导致内存溢出
  • 恶意 order by 导致数据库慢查询
  • 缓存击穿
  • 服务器端请求伪造(SSRF)
  • 任意重定向
  • SQL 注入,Shell 注入,反序列化注入
  • 正则输入源串拒绝服务 ReDoS

5 MySQL 数据库

5.1 表明命名规范

表名、字段名必须使用小写字母或数字,禁止出现数字开头,禁止两个下划线中间只出现数字。

	数据库字段名的修改代价很大,因为无法进行预发布,所以字段名称需要慎重考虑,MySQL 在 Windows 下不区分大小写,但在 Linux 下默认是区分大小写,因此,数据库名、表名、 字段名,都不允许出现任何大写字母,避免节外生枝
  • 一般以t_xxx来作为表名
  • 一般以v_xxx来作为视图名称

5.2 表必备的几个字段

  • 创建人:标记记录的初始创建人
  • 创建时间:标记初始的创建人
  • 修改人:标记修改人
  • 修改时间:标记最后修改日期
  • 版本号:用于统一化的乐观锁

6 工程结构

6.1 线上应用不要依赖 SNAPSHOT 版本

	正式发布的类库必须先去中央仓库进行查证,使 RELEASE 版本号有延续性,且版本号不允许覆盖升级。

6.2 注意POM坐标冲突

禁止在子项目的 pom 依赖中出现相同的 GroupId,相同的 ArtifactId,但是不同的Version。

	在本地调试时会使用各子项目指定的版本号,但是合并成一个 war,只能有一个版本号出现在最后的lib 目录中,曾经出现过线下调试是正确的,发布到线上却出故障的先例。

7 阿里规范插件安装

这里面只列出来了几个比较重要的,很有很多的规约没有写出来,为了让大家码代码的效率更高,可以安装阿里的代码规范插件来约束自己凌乱的代码

阿里规范插件GitHub地址:https://github.com/alibaba/p3c

7.1 IDEA安装该插件步骤

打开IDEA,File-> Setteings->Plugins,在搜索栏搜索Alibaba,然后安装,安装完后点击Restart IntelliJ IDEA重启idea

在这里插入图片描述

7.2 使用

安装好了,使用方法是:打开IDEA,点击tools—>安装的阿里编码规约,可以选择中英文切换,项目右键选择编码规约扫描就可以进行查看自己编码哪些地方不够好

在这里插入图片描述

7.3 检查等级

检查结果一共分三个等级

等级 验证程度 备注
Blocker 严重 有明显问题,影响功能以及性能
Critical 危险 一般问题,遵循标准
Major 主要 一般为建议

7.4 查看结果

可以通过结果查看一般存在的问题

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java阿里巴巴代码规范 的相关文章

  • 任务“:app:dexDebug”执行失败

    我目前正在处理我的项目 我决定将我的 Android Studio 更新到新版本 但在我导入项目后 它显示如下错误 Information Gradle tasks app assembleDebug app preBuild UP TO
  • 如何打印整个字符串池?

    我想打印包含文字的整个字符串池String使用添加的对象intern 就在垃圾收集之前 JDK有没有隐式的方法来进行这样的操作 我们如何检查字符串池 EDIT The comment suggests that there may be a
  • 有没有好的方法来解析用户代理字符串?

    我有一个Java接收模块User Agent来自最终用户浏览器的字符串的行为需要略有不同 具体取决于浏览器类型 浏览器版本甚至操作系统 例如 FireFox 7 0 Win7 Safari 3 2 iOS9 我明白了User Agent由于
  • 如何将 Spotlight for Help 插入本地化的 macOS 应用程序?

    我正在 macOS 上使用 Swing GUI 框架实现 Java 应用程序 当使用system外观和感觉以及screen菜单栏 Swing 自动插入一个搜索栏 called 聚光灯寻求帮助 https developer apple co
  • 想要开发像 Facebook 这样的网站 - 处理数百万个请求 - 高性能 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我想用 Java 开发一个像 Fac
  • Java:VM 如何在 32 位处理器上处理 64 位“long”

    JVM 如何在 32 位处理器上处理 64 位的原始 long 在多核 32 位机器上可以并行利用多个核心吗 64 位操作在 32 位机器上慢了多少 它可能使用多个核心来运行不同的线程 但不会并行使用它们进行 64 位计算 64 位长基本上
  • 参数动态时如何构建 JPQL 查询?

    我想知道是否有一个好的解决方案来构建基于过滤器的 JPQL 查询 我的查询太 富有表现力 我无法使用 Criteria 就像是 query Select from Ent if parameter null query WHERE fiel
  • 覆盖 MATLAB 默认静态 javaclasspath 的最佳方法

    MATLAB 配置为在搜索用户可修改的动态路径之前搜索其静态 java 类路径 不幸的是 静态路径包含相当多非常旧的公共库 因此如果您尝试使用新版本 您可能最终会加载错误的实现并出现错误 例如 静态路径包含 google collectio
  • jmap - 组织和堆操作会给 jvm 带来开销吗?

    正如标题所述 需要多少开销jmap histo and jmap heap分别带到jvm 如果一个内存敏感的 Java 进程处于OutOfMemory 例如 大约 96 的堆已满 并且无法通过 full gc 清除 其中一项操作是否有可能将
  • 从 Java 日历迁移到 Joda 日期时间

    以前 当我第一次设计股票应用相关软件时 我决定使用java util Date表示股票的日期 时间信息 后来我体会到了大部分方法java util Date已弃用 因此 很快 我重构了所有代码以利用java util Calendar 然而
  • 让JScrollPane控制多个组件

    对于我的应用程序 我正在设计一个脚本编辑器 目前我有一个JPanel其中包含另一个JPanel保存行号 位于左侧 以及JTextArea用于允许用户输入代码 位于右侧 目前 我已经实施了JScrollPane on the JTextAre
  • 如何使用 Mockito 和 Junit 模拟 ZonedDateTime

    我需要模拟一个ZonedDateTime ofInstant 方法 我知道SO中有很多建议 但对于我的具体问题 到目前为止我还没有找到任何简单的解决办法 这是我的代码 public ZonedDateTime myMethodToTest
  • 在 AKKA 中,对主管调用 shutdown 是否会停止其监督的所有参与者?

    假设我有一位主管连接了 2 位演员 当我的应用程序关闭时 我想优雅地关闭这些参与者 调用supervisor shutdown 是否会停止所有参与者 还是我仍然需要手动停止我的参与者 gracias 阻止主管 https github co
  • 从 Stax XMLStreamReader 读取以解组部分

    我正在使用 Stax 游标 API 从大型 xml 文件中提取数据 当前 我转到特殊标签的开头并使用 JAXB 解组该标签 这对于格式良好的 xml 文件效果很好 但不久前我有一个文档 其中数十万个标签中有一个未关闭 JAXB 使用 XML
  • 使用 Java 从 S3 上的文件在 S3 上创建 zip 文件

    我在 S3 上有很多文件 需要对其进行压缩 然后通过 S3 提供压缩文件 目前 我将它们从流压缩到本地文件 然后再次上传该文件 这会占用大量磁盘空间 因为每个文件大约有 3 10MB 而且我必须压缩多达 100 000 个文件 所以一个 z
  • 如何在android sdk上使用PowerMock

    我想为我的 android 项目编写一些单元测试和仪器测试 然而 我遇到了一个困扰我一段时间的问题 我需要模拟静态方法并伪造返回值来测试项目 经过一些论坛的调查 唯一的方法是使用PowerMock来模拟静态方法 这是我的 gradle 的一
  • 阻止 OSX 变音符号为所有用户禁用 Java 中的 KeyBindings?

    注 我知道这个问题 https stackoverflow com questions 40335285 java keybinds stop working after holding down a key用户必须输入终端命令才能解决此问
  • 我想要一个 Java 阿拉伯语词干分析器

    我正在寻找阿拉伯语的 Java 词干分析器 我找到了一个名为 AraMorph 的库 但它的输出是无法控制的 并且它会形成不需要的单词 还有其他阿拉伯语词干分析器吗 这是新的阿拉伯语词干分析器 Assem 的阿拉伯语轻词干分析器 http
  • MongoDB Java 驱动程序:MongoCore 驱动程序与 MongoDB 驱动程序与 MongoDB 异步驱动程序

    MongoDB Java 驱动程序有三种不同的驱动程序选项 核心驱动 MongoDB 驱动程序 MongoDB 异步驱动程序 The 驱动程序描述页面 https docs mongodb org ecosystem drivers jav
  • Java中有类似分支/跳转表的东西吗?

    Java有类似分支表或跳转表的东西吗 分支表或跳转表是 根据维基百科 http en wikipedia org wiki Branch table 用于描述使用分支指令表将程序控制 分支 转移到程序的另一部分 或可能已动态加载的不同程序

随机推荐

  • 思科 计算机网络 期末考试答案

    以下哪个域名是顶级域的一个示例 A root cisco com B www cisco com C cisco com D com DNS根域下面是顶级域 也由Internet域名注册授权机构管理 共有3种类型的顶级域 1 通用顶级域名
  • [极客大挑战 2019]Http(BUUCTF)

    前言 这篇文章还是是为了帮助一些 像我这样的菜鸟 找到简单的题解 题目描述 解题工具 我用fiddler抓包 burpsuite也可以 解题过程 用F12查看一下源代码 发现Secret php 进入是一个高档页面 翻译一下意思是 来源不是
  • Centos 7.0 的svn

    第一步 1 1 yum 安装 yum install subversion 1 2 查看版本号 span style font size 16px svn version span 到这就配置成功了 span style font size
  • Prometheus监控各系统

    使用及安装 Prometheus 安装 Prometheus wget https github com prometheus prometheus releases download v2 30 3 prometheus 2 30 3 l
  • 10个数冒泡排序流程图_图文解析:如何用PLC梯形图实现冒泡排序算法?

    作者注 此程序仅供欣赏 作为科普知识了解即可 实际工程当中PLC一般都有专用的排序指令或函数 不需要我们亲自写排序算法 什么是冒泡排序 学习过一点C语言的朋友 对冒泡排序的概念应该并不陌生 冒泡排序是一种非常基础的排序算法 它的过程是将N个
  • G711 G729音频编码总结

    g729编码 每次只能编码160个字节 编码后为10个字节大小 16 1的压缩比 如果要编码320字节的数据 需要分两次进行 并且G729A不支持多路同时解码 否则声音会有问题 G729b也不行 ITU上的代码都不支持多路解码 但是g729
  • 【华为机试真题 C++】高矮个子排队-100

    编程题目 100分 高矮个子排队 2021 H1 H2 2022 Q1 考试题 时间限制 C C 1秒 其他语言 2秒 空间限制 C C 262144K 其他语言524288K 64bit IO Format lld 本题可使用本地IDE编
  • 毕业设计 stm32智能扫地机器人 - 单片机 嵌入式

    文章目录 0 简介 1 课题背景 2 硬件系统总体框架 2 1 电机驱动 2 2 红外线传感器 2 3 超声波传感器 2 4 MPU6050 2 5 ATK ESP8266 WI FI 模块 2 6 电源管理模块 3 软件系统设计 3 1
  • Jupyterlab 3以及Kite代码补全插件安装

    Jupyterlab 3 以及Kite代码补全插件安装 为啥安个这玩意儿 之前一直用Jupyter写一些机器学习和深度学习的东西 尤其是去年一年里白嫖谷歌的Colab很长时间 甚至还开了pro 他们的工作台就是Jupyter类型的 用多了就
  • 【Bias 03】Benchmarking Robustness in Object Detection: Autonomous Driving when Winter is Coming

    Related work Improving corruption robustness 去除腐蚀 1 提出一种基于DNN 恢复雨雾图片质量的方法 2 预处理中去除雨 但这种方法都是针对某种腐蚀 数据增强 把腐蚀数据加入训练 1 blurr
  • C++类模板和static数据成员

    静态数据成员对象之间共享的 当静态数据成员遇上类模板式也是如此吗 现有demo类模板 类中包含static数据成员 template
  • Linux modules-load 启动时加载驱动模块

    Linux modules load 启动时加载驱动模块 Linux 内核包含非常多驱动以及其他功能模块 驱动开发时 我们可以通过insmod命令向内核中载入模块 rmmod卸载模块 lsmod列出加载的所有模块 一般情况下 模块会根据硬件
  • 【MATLAB】常见语法结构和实用操作

    目录 语法结构 循环 遍历 结构 函数结构 画图操作 绘制函数图像 ezplot figure多图绘制 创建多项式 按照系数创建多项式 利用多项式零点创建多项式 解方程组 语法结构 循环 遍历 结构 与其它编程语言类似 Matlab也有循环
  • 对象存储oss的使用

    分为两个大块 1 阿里云oss配置 2 写代码 阿里云oss配置的最终木电的拿到这几个东西 1 accessKeyId 相当于身份认证 在注册完成之后 就可以拿到 2 accessKeySecret 相当于认证的密码 同样注册完成之后 就会
  • word图片撑满_word图片满页 word图片铺满整个页面

    word中如何让图片占满整个页面 确定 再确定 不OK了 7厘米 页面设置 里设置页面方向及纸张大小 当然也要根据你打印机性能 请将下面 锁定纵横比 那个钩取消 如将页面边距设置为0 点 版式 如图片太大你打印机不一定打印得了 再点右下角的
  • Python报错:IndexError: invalid index of a 0-dim tensor. Use `tensor.item()` in

    Python报错如下 E anaconda envs pytorch gpu python exe D project graphsage graphsage model py D project graphsage graphsage e
  • 自动找Bug/插件-代码静态检查findbugs-idea安装以及使用

    目录 简介 IDEA安装FindBugs Findbugs配置 配置排除一些类 扫描级别 IDEA中使用FindBugs 一些常见错误 补充 简介 Findbugs是一个静态分析工具 它检查类或者JAR 文件 将字节码与一组缺陷模式进行对比
  • 闲谈云计算

    其实一直到处看到关于云计算的东西和话题 云计算一直是一个很火的关键字 最近几天才有时间找来一本 云那些事 来看看 只是很粗略的看了关于云计算发展方向的一些问题 具体的云技术是一盘丰盛的大餐 得慢慢吃 其实我一直在没有认真去看云计算的时候 觉
  • Future和FutureTask用法详细介绍

    Future和FutureTask 文章目录 Future和FutureTask Future FutureTask Demo code output 在并发编程中 多线程的实现有继承Thread和Runnable 因为单继承的原因我们往往
  • Java阿里巴巴代码规范

    目录 1 编程规约 1 1 方法参数类型必须一致 不要出现自动装箱拆箱操作 1 1 1 反例 1 1 2 正例 1 2 SimpleDateFormat是线程不安全的 1 2 1 反例 1 2 2 正例 1 3 使用equals方法应该注意