0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Java代码之美,从遵循样式规范开始

京东云 来源:京东零售 刘仲伟 作者:京东零售 刘仲伟 2024-11-27 11:42 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

作者:京东零售 刘仲伟

wKgZPGdGlT2AX8uIAAKWag0WCqs787.png

在软件开发的世界里,代码不仅是程序的基石,更是程序员交流的通用语言。而Java,作为一门广泛应用于企业级应用的编程语言,其代码的可读性和一致性对于项目的长期维护和团队协作至关重要。本文将带你探索Java代码的美学,揭示那些能够让你的代码既美观又高效的样式规范。无论是初出茅庐的新手还是经验丰富的老手,都能从中获得灵感,提升编码的艺术。

一、为什么要代码样式规范

对于团队开发,不同的代码规范或不规范可能引起的问题包括但不限于:

1.代码可读性,代码是为了人阅读的,不是只为了机器执行;

2.代码format引发的大量的diff,干扰code review;

3.间接影响代码质量和团队协作效率;

在敏捷迭代的软件开发环境中,良好的代码规范不仅能够帮助团队成员快速理解彼此的代码,减少沟通成本,还能在代码维护和扩展时节省宝贵的时间。此外,一致的代码风格也是项目专业性的体现,能够给代码审查者和未来的维护者留下良好的第一印象。



二、探索Java代码规范

我们将深入探讨Java社区广泛认可的编码规范,包括但不限于Google Java Style和Oracle官方的编码指南。从命名约定、代码格式化、注释的使用,到错误处理和测试代码的编写,每一个细节都是构建高质量Java代码的关键。

2.1 业界Java代码样式规范

a. Google Java Style

Google在github上维护的多种编程语言的代码规范:https://github.com/google/styleguide,其中:

•javaguide.html 是Google对Java编程语言代码编码标准的完整定义;

•intellij-java-google-style.xml 是Google Java代码规范文件,适用于Intellij IDEA开发工具;

b. 阿里Java规范

阿里在 GitHub 上有一个关于 Java 开发规范的仓库 p3c:https://github.com/alibaba/p3c,其中:

•Java开发手册(黄山版).pdf 覆盖编程规约、异常日志、单元测试等七个维度;

•Alibaba Java Coding Guidelines Jetbrains插件市场提供的代码指导插件, idea-plugin 提供编译、安装、使用手册;

c. 其它规范

公司/组织 Style Guide
Sun/Oracle The Original Sun Java Style Guide
Andriod Android Open Source Project (AOSP) Style Guide
Twitter Twitter’s Java Style Guide
Coderanch The CodeRanch Style Guide

2.2 规范选择与制定

a. 规范选择

上面列举了多项代码规范,在决定使用哪种规范之前,可以考虑三个方面:

•明确目标:使用代码规范的目的是什么,只是为了项目内代码风格一致,还是为了和其他团队分享或者其他公司分享或者开源?

•使用环境:开发阅读代码的环境是什么,GitHub、GitLab、公司内部的Coding?

•工具支持:code format工具支持情况,code sytle check工具支持情况,编译工具:maven、gradle,IDE:IntelliJ、Eclipse、VS Code;

综合上面的三个方面的考虑,优先选择Google Java Style。

b. 规范制定

Google Java Style部分代码样式团队难以接受,比如2空格缩进等,可以在原始Google Java Style基础上,适当定制化调整。

•修改intellij-java-google-style.xml中的内容:

option previous value modified value note
INDENT_SIZE 2 4 行缩进空格数
TAB_SIZE 2 4 TAB空格数
CONTINUATION_INDENT_SIZE 4 8 换行缩进空格数
RIGHT_MARGIN 100 120 单行长度
JD_PRESERVE_LINE_FEEDS TRUE JavaDoc 中,保留手动的换行
KEEP_LINE_BREAKS TRUE Java代码中,保留手动的换行

•修改intellij-java-jd-style.xml文件下载:http://xingyun.jd.com/codingRoot/liuzhongwei18/styleguide/blob/master/intellij-java-jd-style.xml

2.3 规范使用

代码样式规范的使用分为两个方面:

•代码格式化

•代码样式校验

规范使用 英文 使用对象 使用方式 说明 配置文件
代码格式化 code style 开发者 IDE手动 定义代码风格 intellij-java-jd-style.xml
代码样式校验 check style 团队 自动化 校验代码风格 checkstyle.xml

注意:code style 跟 check style 的「配置文件」必须对应,即按照code style format的代码check style不报错。

代码样式校验

代码格式化依赖于开发者手动进行格式化,为达到团队/项目代码样式规范的落地,需要有全面的自动化的代码检查。根据当前业界推荐,采用Checkstyle作为自动化代码样式校验工具。

需要对原始 Google Code Style 的google_checks进行定制,以适配上面intellij-java-jd-style.xml的定制。

•修改google_checks中的内容:

module property previous value modified value note
LineLength max 100 120 单行长度
Indentation basicOffset braceAdjustment caseIndent throwsIndent lineWrappingIndentation arrayInitIndent 2 2 2 4 4 2 4 0 4 4 4 4 使用checkstyle默认缩进风格

•修改checkstyle.xml文件下载:http://xingyun.jd.com/codingRoot/liuzhongwei18/styleguide/blob/master/checkstyle.xml



除了上述的长度和缩进的代码样式校验,Checkstyle还可以配置其它代码校验,可根据团队接受情况予以配置。

module property default value note
FileLength max 2000 单个文件长度
MethodLength max 150 单个方法长度
ParameterNumber max 7 方法的参数个数
ModifierOrder 

Java语言规范
NestedIfDepth max 1 检查if-else嵌套层数
NestedTryDepth max 1 检查try-catch-finally嵌套层数
ReturnCount max 2 一个方法最多有return的数量
CyclomaticComplexity max 10 方法圈复杂度
MagicNumber 

检查魔法数字,未被定义为常量的数值
... 

https://checkstyle.org/checks.html



三、最佳实践:如何将规范融入日常开发

3.1 code style配置&使用

a. IDEA配置code style

在 IntelliJ IDEA下,使用intellij-java-jd-style.xml进行代码格式化之前,需要先进行配置。

设置配置文件,路径:IntelliJ IDEA→Preference→Editor→Code Style,参考下图:

导入定制的code style文件:intellij-java-jd-style.xml

wKgZO2dGlT2ALn6kAAe30vL7Pc8157.png

命名Scheme,如图中JD-Style,并启用该代码样式规范

wKgZPGdGlT6ALxOyAAiAbns_I4A478.png

b. IDEA使用code style

完成上述配置后,在Mac环境的IntelliJ IDEA中,可以对选中的代码格式化(快捷键:Option+Command+L)或者对选中的文件格式化(快捷键:Shift+Option+Command+L)

wKgZO2dGlT-AWgYYAABQwyQMEbU629.png



3.2 check style配置&使用

check style的配置和使用有两种主要方式:

1. 在开发环境IDE中,开发者配置插件后,可触发代码样式规范的检查,根据提示项进行代码修改;

2.在maven项目中,配置checkstyle插件,可用命令行触发代码样式规范的检查,集成到CI (Continuous Integration)的自动化流水线中;

a. IDEA配置CheckStyle插件

在 IntelliJ IDEA下,安装Plugin,路径:IntelliJ IDEA→Preference→Plugins,参考下图:

wKgZPGdGlUCAU1NtAASXa5zZnuw026.png

下载配置文件checkstyle.xml,配置CheckStyle-IDEA插件,路径:IntelliJ IDEA→Preference→Tools→Checkstyle,增加自定义配置文件并命名,参考下图:

wKgZO2dGlUGAELkHAAkPLLbd_cE071.png

b. IDEA使用CheckStyle插件

安装配置CheckStyle插件后,工具窗口增加了CheckStyle Tab,在CheckStyle窗口进行check,可以选择:

•Check Current File

•Check Module

•Check Project

wKgZPGdGlUKABiSRAAStslUa_NU290.png

c. maven配置CheckStyle插件

参考Checkstyle maven插件的官方配置案例:多模块项目配置,通常我们在项目中新建build-tools模块,将checkstyle.xml等配置文件放在这个模块的resources目录下。

project-name
| -- pom.xml
| -- build-tools
| | -- pom.xml
| | -- src
| | | -- main
| | | -- resources
| | | -- checkstyle.xml
| | | -- checkstyle-suppressions.xml
| -- core
| -- gui
| -- other-module

build-tools模块的pom.xml使用IDEA自动生成的配置文件,类似:

< ?xml version="1.0" encoding="UTF-8"? >
< project >
    < parent >
        < artifactId >project-name< /artifactId >
        < groupId >com.jd.project-name< /groupId >
        < version >1.0.0< /version >
    < /parent >

    < modelVersion >4.0.0< /modelVersion >
    < artifactId >build-tools< /artifactId >
< /project >

配置文件checkstyle.xml、checkstyle-suppressions.xml可以从coding中下载http://xingyun.jd.com/codingRoot/liuzhongwei18/styleguide/blob/master/。

父项目的pom.xml中,增加如下配置:

< project >
    ...
    < modules >
        ...
        < module >build-tools< /module >
    < /modules >

    < properties >
        ...
        < maven.checkstyle.version >3.6.0< /maven.checkstyle.version >
    < /properties >

    
        < pluginManagement >
            < plugins >
                < plugin >
                    < !-- Approach followed here is roughly the same as mentioned here:
                         https://maven.apache.org/plugins/maven-checkstyle-plugin/examples/multi-module-config.html
                    -- >
                    < groupId >org.apache.maven.plugins< /groupId >
                    < artifactId >maven-checkstyle-plugin< /artifactId >
                    < version >${maven.checkstyle.version}< /version >
                    < configuration >
                        < configLocation >build-tools/src/main/resources/checkstyle.xml< /configLocation >
                        < includeTestSourceDirectory >true< /includeTestSourceDirectory >
                        < outputFile >checkstyle-report.xml< /outputFile >
                        < consoleOutput >false< /consoleOutput >
                        < failOnViolation >true< /failOnViolation >
                        < excludes >target/**< /excludes >
                    < /configuration >
                    < executions >
                        < execution >
                            < id >checkstyle< /id >
                            < phase >validate< /phase >
                            < goals >
                                < goal >check< /goal >
                            < /goals >
                        < /execution >
                    < /executions >
                < /plugin >
            < /plugins >
        < /pluginManagement >
        < plugins >
            < plugin >
                < groupId >org.apache.maven.plugins< /groupId >
                < artifactId >maven-checkstyle-plugin< /artifactId >
            < /plugin >
        < /plugins >
    < /build >
    < reporting >
        < plugins >
            < plugin >
                < groupId >org.apache.maven.plugins< /groupId >
                < artifactId >maven-checkstyle-plugin< /artifactId >
                < reportSets >
                    < reportSet >
                        < reports >
                            < report >checkstyle< /report >
                        < /reports >
                    < /reportSet >
                < /reportSets >
            < /plugin >
        < /plugins >
    < /reporting >

< /project >

maven-checkstyle-plugin的配置参数具体可参见checkstyle:check的参数说明。

这里对几项配置进行说明:

•plugins>plugin>executions>execution

◦id可以自行决定,这里选择"checkstyle";

◦phase是绑定到maven lifecycle的哪个执行阶段,这里绑定到"validate"上,即执行maven validate的时候会执行该plugin任务;选择validate阶段可以保障checkstyle:check在代码编译之前执行,如果checkstyle检查出违反样式规范的问题,在代码编译之前就会报告出来;

◦goals>goal是只绑定执行plugin的哪个任务,这里绑定的是"check";

•plugins>plugin>configuration>failOnViolation

◦检查到违反样式规范的问题,打印出来,打印的问题级别根据checkstyle.xml中配置的severity确定;

◦将severity级别配置为error,并将failOnViolation设为true,检查到违反样式规范的问题时,会停止maven命令继续执行;

注意:failOnViolation与failOnError配置项的区别,failOnError在检查到问题时立即停止执行,failOnViolation在检查到问题时输出检查日志再停止执行。

按照上述配置,可达到在mvn编译代码前强制检查代码样式规范,发现违反规范的问题,不会继续java的编译、打包。

d. maven使用CheckStyle插件

运行mvn package即可正常打包。

也可以单独执行命令:

mvn checkstyle:check

注意:为了实现自动化代码样式规范检查,可以为项目配置行云流水线任务,设置代码评审的自动化检查:指定流水线做为卡点,指定为卡点的流水线需运行成功后MR才允许合并。



四、结语:代码规范-团队协作的桥梁

最后,我们总结下Java样式规范对于团队协作的重要性,鼓励每位开发者将这些规范内化为自己的编码习惯。因为代码规范不仅是个人技艺的体现,更是团队协作和项目成功的基石。

通过阅读本文,你将不仅了解到Java样式规范的重要性,还将掌握如何将这些规范应用到实际开发中,让你的代码变得更加优雅和强大。让我们一起追求编码的艺术,用规范的代码点亮编程的世界。



参考

•京东JAVA代码规范-V1.0.pdf

•JD编码规范:https://doc.jd.com/base/eos-doc/system-rule/JD%E7%BC%96%E7%A0%81%E8%A7%84%E8%8C%83/Java/

•Jetbrains Java code style: https://www.jetbrains.com/help/idea/code-style-java.html

•checkstyle官网:https://checkstyle.org/index.html

•checkstyle发布:https://github.com/checkstyle/checkstyle/releases/

•Apache Maven Checkstyle Plugin: https://maven.apache.org/plugins/maven-checkstyle-plugin/usage.html

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • JAVA
    +关注

    关注

    20

    文章

    2997

    浏览量

    115671
  • 代码
    +关注

    关注

    30

    文章

    4941

    浏览量

    73145
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    Arm Neoverse CPU上大代码Java应用的性能测试

    Java 是互联网领域广泛使用的编程语言。Java 应用的一些特性使其性能表现与提前编译的原生应用(例如 C 程序)大相径庭。由于 Java 字节码无法直接在 CPU 上执行,因此通常运行时在
    的头像 发表于 11-05 11:25 371次阅读
    Arm Neoverse CPU上大<b class='flag-5'>代码</b>量<b class='flag-5'>Java</b>应用的性能测试

    如何直接main函数开始仿真?

    段地址也要修改) 2. 修改前三条指令: 80000000:10010117auipcsp,0x10010#堆栈指针90010000开始80000004:293000efjalra
    发表于 11-05 06:10

    Java 25正式发布,重要特性详解(附代码示例):灵活构造函数体、模块导入声明、AOT方法分析等

    Java 25现已发布,更多新特性来了!配合Perforce JRebel,代码修改即时生效,无需重启服务,即可实现“改完就看效果”。新特性+快工具,让你的Java开发体验双倍提升!
    的头像 发表于 10-29 13:16 852次阅读
    <b class='flag-5'>Java</b> 25正式发布,重要特性详解(附<b class='flag-5'>代码</b>示例):灵活构造函数体、模块导入声明、AOT方法分析等

    代码格式化工具Clang-Format提升你的CW32工程质量

    它能自动统一团队代码风格,让不同开发者写出的代码如出一辙。就像 CW32 官方库函数遵循统一规范一样,Clang-Format 能让团队所有成员的
    的头像 发表于 10-09 17:43 903次阅读
    <b class='flag-5'>代码</b>格式化工具Clang-Format提升你的CW32工程质量

    国产 OPS 电脑是否完全遵循 Intel OPS 规范,能直接适配华为智慧黑板、鸿合教育一体机吗?

    触控一体机厂家在采购国产 OPS 电脑时,最担心的问题之一便是 “适配性”—— 害怕国产 OPS 电脑不遵循通用规范,导致无法与华为智慧黑板、鸿合教育一体机等主流设备兼容,出现触控失灵、显示卡顿
    的头像 发表于 08-23 18:11 572次阅读

    Perforce JRebel 简介:即时加载代码变更,加速Java应用开发

    Perforce JRebel 专为Java开发提速而生!支持跳过构建与重新部署,实时加载代码变更,支持100+框架,无缝集成主流IDE与应用服务器。
    的头像 发表于 08-14 14:35 487次阅读
    Perforce JRebel 简介:即时加载<b class='flag-5'>代码</b>变更,加速<b class='flag-5'>Java</b>应用开发

    缓存根上理解 ConcurrentHashMap

    表的占用,以保持并发可读性,次要目的是保持空间消耗与 HashMap 相同或更好,并支持利用多线程在空表上高效地插入初始值。在 Java 8 及之后的版本,使用 CAS 操作
    的头像 发表于 08-05 14:48 416次阅读

    如何使用USB2.0将数据fpga传输到PC?

    : Input/Output Error您CAN 帮助我找到此错误的解决方案,以便 CAN 将数据 fpga 发送到计算机?在此先感谢。 告诉我是否需要查看 JAVA 代码和 vhdl 项目。 预先谢谢
    发表于 05-29 06:28

    Java开发者必备的效率工具——Perforce JRebel是什么?为什么很多Java开发者在用?

    Perforce JRebel是一款Java开发效率工具,旨在帮助java开发人员更快地编写更好的应用程序。JRebel可即时重新加载对代码的修改,无需重启或重新部署应用程序,就能让开发者即时看到
    的头像 发表于 04-27 13:44 648次阅读
    <b class='flag-5'>Java</b>开发者必备的效率工具——Perforce JRebel是什么?为什么很多<b class='flag-5'>Java</b>开发者在用?

    Java 到 Go:面向对象的巨人与云原生的轻骑兵

    Go 语言在 2009 年被 Google 推出,在创建之初便明确提出了“少即是多(Less is more)”的设计原则,强调“以工程效率为核心,用极简规则解决复杂问题”。它与 Java 语言生态
    的头像 发表于 04-25 11:13 507次阅读

    我只会Java,凭什么不能玩转树莓派?GPIO操控竟比C++更优雅~

    导语当全球开发者默认将Python视为树莓派的"母语"时,一个颠覆认知的工具链正在Java开发者群体中口口相传——Pi4J让Java代码直接操控GPIO、I2C、SPI等硬件接口
    的头像 发表于 03-25 09:21 865次阅读
    我只会<b class='flag-5'>Java</b>,凭什么不能玩转树莓派?GPIO操控竟比C++更优雅~

    Java的SPI机制详解

    接口规范以及可以发现接口实现的机制,而不需要实现接口。 SPI机制在Java中应用广泛。例如:JDBC中的数据库连接驱动使用SPI机制,只定义了数据库连接接口的规范,而具体实现由各大数据库厂商实现,不同数据库的实现不同,我们常用
    的头像 发表于 03-05 11:35 1111次阅读
    <b class='flag-5'>Java</b>的SPI机制详解

    光宣布 1γ DRAM 开始出货:引领内存技术突破,满足未来计算需求

    光业界首款高性能 1γ 节点技术,为数据中心、客户端及移动平台带来卓越的性能与能效   2025 年 2 月 26 日,中国上海 —   光科技股份有限公司(纳斯达克股票代码:MU)今日宣布,已
    发表于 02-26 13:58 478次阅读

    DLP4500怎么确定投影仪开始投影的同时相机的c++代码开始运行?

    投影仪通过trig1 链接相机,投影仪投图同时触发相机,相机采集图像并传回电脑,相机的代码里需要添加dlp4500的api或sdk代码吗,怎么确定投影仪开始投影的同时相机的c++代码
    发表于 02-18 07:16

    SSM框架在Java开发中的应用 如何使用SSM进行web开发

    SSM框架,即Spring、SpringMVC和MyBatis的整合,是Java Web开发中常用的技术栈。它通过分层架构,实现了视图、控制、业务逻辑和数据访问的分离,提高了代码的可维护性和可扩展性
    的头像 发表于 12-16 17:28 2128次阅读