当前位置: 首页 > article >正文

新手到资深的Java开发编码规范

新手到资深的开发编码规范

  • 一、前言
  • 二、命名规范:代码的 “第一印象”
    • 2.1 标识符命名原则
    • 2.2 命名的 “自描述性” 原则
    • 2.3 避免魔法值
  • 三、代码格式规范:结构清晰的视觉美学
    • 3.1 缩进与空格
    • 3.2 代码块规范
    • 3.3 换行与断行
  • 四、注释规范:代码的 “说明书”
    • 4.1 注释的分类与写法
      • 4.1.1 文档注释(Javadoc)
      • 4.1.2 单行注释
      • 4.1.3 禁止无意义注释
    • 4.2 注释的 “时机”
  • 五、控制语句规范:逻辑清晰的 “流程图”
    • 5.1 if-else 语句
    • 5.2 循环语句
    • 5.3 switch 语句
  • 六、异常处理规范:健壮性的 “防护网”
    • 6.1 异常类型选择
    • 6.2 避免捕获通用异常
    • 6.3 finally 的正确使用
  • 七、团队协作规范:多人开发的 “协作契约”
    • 7.1 Git 提交规范
    • 7.2 代码评审(Code Review)
    • 7.3 分支管理
  • 八、工具链支持:让规范 “自动化”
    • 8.1 静态代码分析工具
    • 8.2 IDE 配置
    • 8.3 提交钩子(Pre-commit Hook)
  • 九、编码规范的 “道” 与 “术”
    • 9.1 规范的本质:平衡 “一致性” 与 “灵活性”
    • 9.2 从 “被动遵守” 到 “主动优化”
  • 总结:规范是 “软实力” 的硬指标

一、前言

软件开发中编码规范是团队协作的 “通用语言”,它不仅是代码可读性的保障,更是团队效率、项目可维护性和系统稳定性的基石。当多个开发者接手同一项目时,统一的编码规范能让代码像标准化零件一样易于理解和维护;而混乱的代码风格则可能导致 “牵一发而动全身” 的维护噩梦。

二、命名规范:代码的 “第一印象”

2.1 标识符命名原则

类型 命名规则 示例 反例
类名 驼峰命名,首字母大写 UserService、OrderController user_service
方法名 驼峰命名,首字母小写 getUserName、processOrder GetUserName
变量名 驼峰命名,首字母小写 orderId、currentPageNumber ORDER_ID
常量名 全大写,下划线分隔 MAX_PAGES、DEFAULT_TIMEOUT MaxPages
包名 小写字母,域名倒序 com.example.utils Com.Example.Utils
枚举名 驼峰命名,后缀加 Enum StatusEnum、ErrorCodeEnum status_enum

2.2 命名的 “自描述性” 原则

好的命名应能直观表达含义:

  • 反例:int a; (无法判断用途)

  • 正例:int pageSize; (明确表示分页大小)

2.3 避免魔法值

用常量替代硬编码:

// 反例:硬编码魔法值
if (status == 1) { ... }// 正例:使用枚举或常量
enum Status {VALID(1), INVALID(0);private int code;// ...
}
if (status == Status.VALID.getCode()) { ... }

三、代码格式规范:结构清晰的视觉美学

3.1 缩进与空格

  • 缩进:使用 4 个空格(IDE 设置取消 Tab 键,统一转换为空格)

  • 运算符空格:if (a > b && c < d) (运算符前后加空格)

  • 方法参数空格:printMessage("Hello", world) (逗号后加空格)

3.2 代码块规范

  • 大括号换行规则:
// 正例:K&R风格,左大括号不换行
if (condition) {doSomething();
}// 反例:左大括号换行(非Java主流风格)
if (condition)
{doSomething();
}

3.3 换行与断行

  • 每行代码不超过 120 字符(IDE 设置垂直参考线)

  • 长方法参数断行:

// 正例:参数过多时断行,对齐第一个参数
result = calculateTotalPrice(itemPrice, discount, taxRate, shippingFee
);

四、注释规范:代码的 “说明书”

4.1 注释的分类与写法

4.1.1 文档注释(Javadoc)

用于类、方法、字段的说明,生成 API 文档:

/*** 订单服务类* @author John Doe* @version 1.0.0* @since 2023-10-01*/
public class OrderService {/*** 计算订单总金额* @param items 订单项列表* @return 总金额(单位:元)* @throws NullPointerException 当items为null时抛出*/public double calculateTotalPrice(List<Item> items) { ... }
}

4.1.2 单行注释

用于解释复杂逻辑或临时标记:

// 缓存有效期设置为1小时(单位:毫秒)
int cacheTimeout = 60 * 60 * 1000; // TODO: 后续需优化为分布式锁
synchronized (lock) { ... }

4.1.3 禁止无意义注释

// 反例:重复代码逻辑的注释
int count = list.size(); // 获取列表长度

4.2 注释的 “时机”

  • 复杂业务逻辑处

  • 容易误解的算法或公式旁

  • 可能引发线程安全的代码块

  • 与第三方交互的关键节点

五、控制语句规范:逻辑清晰的 “流程图”

5.1 if-else 语句

  • 避免多层嵌套(建议不超过 3 层),可通过提前返回简化:
// 反例:多层嵌套
if (user != null) {if (user.isActive()) {if (user.hasPermission()) {doAction();}}
}// 正例:提前返回
if (user == null) return;
if (!user.isActive()) return;
if (!user.hasPermission()) return;
doAction();

5.2 循环语句

  • 优先使用增强 for 循环遍历集合:
// 正例:增强for循环
for (String item : itemList) { ... }// 反例:传统for循环(无下标需求时)
for (int i=0; i<itemList.size(); i++) { ... }

5.3 switch 语句

  • 必写 default 分支(即使逻辑为空):
switch (status) {case VALID:process();break;case INVALID:reject();break;default:// 防止新增枚举值未处理throw new IllegalArgumentException("Unknown status: " + status);
}

六、异常处理规范:健壮性的 “防护网”

6.1 异常类型选择

  • 优先使用业务异常(继承 RuntimeException):
public class OrderException extends RuntimeException {public OrderException(String message) {super(message);}
}

6.2 避免捕获通用异常

// 反例:捕获Exception
try {// 业务逻辑
} catch (Exception e) { // 可能隐藏NullPointerException等深层问题e.printStackTrace();
}// 正例:捕获具体异常
try {// 业务逻辑
} catch (IOException e) {handleIOError(e);
} catch (SQLException e) {handleDBError(e);
}

6.3 finally 的正确使用

  • finally 块中避免抛出异常:
FileInputStream fis = null;
try {fis = new FileInputStream("data.txt");// 读取文件
} catch (IOException e) {log.error("读取文件失败", e);
} finally {if (fis != null) {try {fis.close(); // 内部异常应捕获处理} catch (IOException e) {log.warn("关闭文件失败", e);}}
}

七、团队协作规范:多人开发的 “协作契约”

7.1 Git 提交规范

  • 提交信息格式:[模块名] 操作类型: 描述
[UserService] fix: 修复用户查询接口空指针问题
[OrderModule] feat: 新增订单状态回调功能

7.2 代码评审(Code Review)

  • 评审重点:

    • 业务逻辑正确性

    • 性能影响(如循环复杂度、IO 操作)

    • 规范一致性(命名、注释、格式)

    • 安全漏洞(如 SQL 注入、权限控制)

7.3 分支管理

  • 采用 Git Flow 规范:

    • master 分支:生产环境代码(仅通过 tag 发布)

    • develop 分支:开发主分支

    • feature 分支:功能开发(从 develop 拉出,合并回 develop)

    • release 分支:预发布分支(从 develop 拉出,合并回 develop 和 master)

    • hotfix 分支:紧急修复(从 master 拉出,合并回 master 和 develop)

八、工具链支持:让规范 “自动化”

8.1 静态代码分析工具

  • SonarQube:代码质量检测(如圈复杂度、重复代码)

  • Checkstyle:强制代码格式规范(可集成到 IDE 和 CI/CD)

  • FindBugs:检测潜在 BUG(如空指针、资源泄漏)

8.2 IDE 配置

  • 在 IntelliJ IDEA 中导入 Alibaba Java Coding Guidelines 插件,实时提示规范问题

8.3 提交钩子(Pre-commit Hook)

通过pre-commit工具在代码提交前自动检查:

# 安装pre-commit
pip install pre-commit# 配置检查项(.pre-commit-config.yaml)
repos:- repo: https://github.com/pre-commit/mirrors-checkstylerev: v1.4.0hooks:- id: checkstyleargs: ["-c", "config/checkstyle.xml"]

九、编码规范的 “道” 与 “术”

9.1 规范的本质:平衡 “一致性” 与 “灵活性”

  • 基础规范(命名、格式)必须严格遵守

  • 业务规范(如异常处理层级)可根据项目特点调整

  • 避免过度追求规范导致代码僵化(如无意义的注释堆砌)

9.2 从 “被动遵守” 到 “主动优化”

  • 初级阶段:严格按照规范编写代码

  • 进阶阶段:理解规范背后的设计原则(如单一职责、开闭原则)

  • 高级阶段:参与制定团队规范,推动技术债治理

总结:规范是 “软实力” 的硬指标

编码规范看似 “细枝末节”,实则是团队技术实力的重要体现。一个注重规范的团队,往往在需求变更、系统重构时展现出更强的韧性。正如 Martin Fowler 在《重构》中提到:“任何一个傻瓜都能写出计算机可以理解的代码,而优秀的程序员写出的代码是人类可以理解的。”

参考资料

  • 阿里巴巴 Java 开发手册

  • Clean Code: A Handbook of Agile Software Craftsmanship

  • Oracle Java Coding Conventions

通过工具辅助 + 团队共识 + 持续改进,让编码规范成为团队的 “技术护城河”,这才是现代软件开发的可持续之道。

That’s all, thanks for reading!
觉得有用就点个赞、收进收藏夹吧!关注我,获取更多干货~

相关文章:

新手到资深的Java开发编码规范

新手到资深的开发编码规范 一、前言二、命名规范&#xff1a;代码的 “第一印象”2.1 标识符命名原则2.2 命名的 “自描述性” 原则2.3 避免魔法值 三、代码格式规范&#xff1a;结构清晰的视觉美学3.1 缩进与空格3.2 代码块规范3.3 换行与断行 四、注释规范&#xff1a;代码的…...

asp.net core 添加 EntityFrame

1&#xff1a;Nuget 引入程序集 Microsoft.EntityFrameworkCore Microsoft.EntityFrameworkCore.SqlServer Microsoft.EntityFrameworkCore.SqlServer.Design Microsoft.EntityFrameworkCore.Tools 2&#xff1a;执行脚本 Scaffold-DbContext "Data Source.;Initial Ca…...

微软全新开源的Agentic Web网络项目:NLWeb,到底是什么 ?

目录 1、背景 2、NLWeb是什么&#xff1f; 3、NLWeb是如何工作的&#xff1f; 3.1 技术原理 3.2 对发布者的价值 3.3 核心团队与合作伙伴 4、快速入门指南 5、延伸阅读 Agentic&#xff1a;Agent的形容词&#xff0c;Agentic指系统由大型语言模型&#xff08;LLM&#…...

Idea出现 100% classes 等

总是误点出来&#xff0c;每次又忘了怎么消除&#xff0c;在这里记录一下。 出现这样&#xff1a; 操作idea界面的&#xff1a;点击View->Tool Windows ->Coverage&#xff0c;然后关掉...

【学习笔记】计算机操作系统(五)—— 虚拟存储器

第五章 虚拟存储器 文章目录 第五章 虚拟存储器5.1 虚拟存储器概述5.1.1 常规存储管理方式的特征和局部性原理5.1.2 虚拟存储器的定义和特征5.1.3 虚拟存储器的实现方法 5.2 请求分页存储管理方式5.2.1 请求分页中的硬件支持5.2.2 请求分页中的内存分配5.2.3 页面调入策略 5.3 …...

构建基于全面业务数据的大数据与大模型企业护城河战略

引言&#xff1a;数据与AI驱动的专精企业未来 在数字化浪潮和人工智能技术飞速发展的今天&#xff0c;对于“专精特新”型企业而言&#xff0c;如何利用自身积累的深厚行业知识和独特的业务数据&#xff0c;结合大数据分析与大模型能力&#xff0c;构建难以被复制的竞争壁垒&a…...

centos系统redis-dump安装

1. ​Ruby 环境​ Redis-dump 是一个 Ruby 工具&#xff0c;需先安装 Ruby 和 RubyGems。 安装依赖​&#xff1a; sudo yum install -y curl gpg2 gcc-c patch readline readline-devel zlib zlib-devel libyaml-devel libffi-devel openssl-devel make bzip2 autoconf aut…...

乘最多水的容器 | 算法 | 给定一个整数数组。有n条垂线。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

在我们日常生活中&#xff0c;蓄水似乎是一个极为朴素的物理行为&#xff1a;两堵墙之间&#xff0c;注入水&#xff0c;看谁能装得更多。可如果换个角度&#xff0c;从算法的视角去看这个问题&#xff0c;它会变得怎样&#xff1f;你是否意识到&#xff0c;这样一个简单的问题…...

Python项目文件组织与PyCharm实践:打造高效开发环境

# Python项目文件组织与PyCharm实践&#xff1a;打造高效开发环境 在Python编程的世界里&#xff0c;合理组织项目文件是提升代码质量、增强可维护性以及促进团队协作的关键。同时&#xff0c;借助强大的集成开发环境&#xff08;IDE&#xff09;——PyCharm&#xff0c;我们能…...

【Java高阶面经:数据库篇】19、分库分表查询困境:无分库分表键时的高效应对

一、分库分表下的无分片键查询困境 在分布式数据库架构中,分库分表通过分片键(如买家ID)将数据分散存储,显著提升了单表性能和系统扩展性。然而,当业务需要从非分片键维度(如卖家ID)进行查询时,传统架构暴露出以下核心问题: 1.1 跨分片扫描的性能灾难 数据分散性:以…...

spring中的BeanFactoryAware接口详解

一、接口定义与核心作用 BeanFactoryAware 是 Spring 框架提供的一个回调接口&#xff0c;允许 Bean 在初始化阶段获取其所属的 BeanFactory 实例。该接口定义如下&#xff1a; public interface BeanFactoryAware {void setBeanFactory(BeanFactory beanFactory) throws Bea…...

Unity Hub打不开项目一直在加载

Unity Hub打不开项目&#xff0c;一直在加载。 运行环境&#xff1a;win10 解决方法&#xff1a;退还个人许可证&#xff0c;退出UnityHub重新登录后,再次获取个人许可证 Tips&#xff1a; 国内连续超过三天不登陆就需要激活一次。&#xff08;每天登陆一次会自动续时间吗&…...

蓝桥杯19681 01背包

问题描述 有 N 件物品和一个体积为 M 的背包。第 i 个物品的体积为 vi​&#xff0c;价值为 wi​。每件物品只能使用一次。 请问可以通过什么样的方式选择物品&#xff0c;使得物品总体积不超过 M 的情况下总价值最大&#xff0c;输出这个最大价值即可。 输入格式 第一行输…...

服务器操作系统调优内核参数(方便查询)

fs.aio-max-nr1048576 #此参数限制并发未完成的异步请求数目&#xff0c;应该设置避免I/O子系统故障 fs.file-max1048575 #该参数决定了系统中所允许的文件句柄最大数目&#xff0c;文件句柄设置代表linux系统中可以打开的文件的数量 fs.inotify.max_user_watches8192000 #表…...

ElasticSearch导读

ElasticSearch 简介&#xff1a;ElasticSearch简称ES是一个开源的分布式搜素和数据分析引擎。是使用Java开发并且是当前最流行的开源的企业级搜索引擎&#xff0c;能够达到近实时搜索&#xff0c;它专门设计用于处理大规模的文本数据和实现高性能的全文搜索。它基于 Apache Luc…...

【机器学习】 关于外插修正随机梯度方法的数值实验

1. 随机梯度下降&#xff08;SGD&#xff09; 迭代格式&#xff1a; x k 1 x k − η k ∇ f i ( x k ) x_{k1} x_k - \eta_k \nabla f_i(x_k) xk1​xk​−ηk​∇fi​(xk​) 其中&#xff0c; η k \eta_k ηk​ 为步长&#xff08;可能递减&#xff09;&#xff0c; ∇ f…...

结构型:组合模式

目录 1、核心思想 2、实现方式 2.1 模式结构 2.2 实现案例 3、优缺点分析 4、适用场景 1、核心思想 目的&#xff1a;将总是在重复、迭代地显示的某种自相似性的结构&#xff08;部分与整体结构特征相似&#xff09;&#xff0c;例如树形结构&#xff0c;以统一的方式处…...

windows 删除文件夹提示“操作无法完成,因为其中的文件夹或文件已在另一程序中打开”

windows 删除文件夹提示“操作无法完成&#xff0c;因为其中的文件夹或文件已在另一程序中打开” tomact已经关闭了&#xff0c;刚开始怀疑是tomcat关闭不彻底&#xff0c;但是任务管理器–》进程里根本没有java的进程了&#xff0c;由于是医院服务器、不方便重启 解决方法&am…...

使用 electron-builder 打包与发布 Electron 应用

基于 electron-vite-vue 项目结构 本文将基于 electron-vite-vue 脚手架&#xff0c;详细介绍如何使用 electron-builder 实现&#xff1a; ✅ 多平台打包&#xff08;Windows / macOS / Linux&#xff09;✅ 自动更新发布配置✅ 常用构建脚本与输出结构 &#x1f4c1; 项目结…...

微信小程序中,解决lottie动画在真机不显示的问题

api部分 export function getRainInfo() {return onlineRequest({url: /ball/recruit/getRainInfo,method: get}); }data存储json数据 data&#xff1a;{rainJson:{} }onLoad方法获取json数据 onLoad(options) {let that thisgetRainInfo().then((res)>{that.setData({r…...

Wireshark 抓包工具使用

1.下载地址 https://2.na.dl.wireshark.org/win64/ 或者 Wireshark Go Deep 2.安装并打开 3.电脑设置热点&#xff0c;手机连接热点 4.手机发起网络请求&#xff0c;工具上选择WLAN。或者本地连接 5.点击查看抓包数据&#xff0c;过滤。最好用发送端ip过滤&#xff0c;s…...

大语言模型(LLM)本身是无状态的,怎么固化记忆

大语言模型(LLM)本身是无状态的,无法直接“记住”历史对话或用户特定信息 大语言模型(LLM)本身是无状态的,无法直接“记住”历史对话或用户特定信息,但可以通过架构改进、外部记忆整合、训练方法优化等方案实现上下文记忆能力。 一、模型内部记忆增强:让LLM“记住”…...

JUC入门(六)

12、四大函数式接口 Consumer<T>&#xff08;消费者接口&#xff09; 源码 功能 接收一个参数T&#xff0c;不返回任何结果。主要用于消费操作&#xff0c;例如打印日志、更新状态等。 使用场景 遍历集合并执行操作。 对象的字段赋值。 代码示例 import java.util.…...

std::chrono类的简单使用实例及分析

author: hjjdebug date: 2025年 05月 20日 星期二 14:36:17 CST descrip: std::chrono类的简单使用实例及分析 文章目录 1.实例代码:2. 代码分析:2.1 auto t1 std::chrono::high_resolution_clock::now();2.1.1 什么是 system_clock2.1.2 什么是 chrono::time_point?2.1.3 什…...

Git命令汇总(自用,持续更新update 5/23)

文章目录 Git常见命令1. 推送空提交2. 提交Clean-PR3. 回退add操作4. 交互式rebase4.1 切换模式4.2 保存与退出4.3 注意Rebase 5. 合并多个commit 问题一&#xff1a;Clone Github报错The TLS connection was non-properly terminated.TLS握手报错原因解决 问题二&#xff1a;F…...

window xampp apache使用腾讯云ssl证书配置https

下载腾讯云ssl证书&#xff1a; 编辑Apache根目录下 conf/httpd.conf 文件&#xff1a; #LoadModule ssl_module modules/mod_ssl.so和#Include conf/extra/httpd-ssl.conf&#xff0c;去掉前面的#号注释。 编辑Apache根目录下 conf/httpd-ssl.conf 文件&#xff1a; <Vi…...

MATLAB求解二元一次方程组基础教程

MATLAB求解二元一次方程组基础教程 一、二元一次方程组简介 二元一次方程组是包含两个未知数(x和y)的一组方程&#xff0c;每个方程中未知数的最高次数为1。一般形式为&#xff1a; a₁x b₁y c₁ a₂x b₂y c₂其中a₁, b₁, c₁, a₂, b₂, c₂为已知系数。 二、MATL…...

Android13 wifi设置国家码详解

Android13 wifi设置国家码详解 文章目录 Android13 wifi设置国家码详解一、前言二、设置wifi国家码相关代码1、adb或者串口也能设置和获取当前国家码&#xff08;1&#xff09;查询命令的方式&#xff08;2&#xff09;获取和设置国家码的示例 2、Java代码设置国家码3、获取当前…...

逆向音乐APP:Python爬虫获取音乐榜单 (1)

1. 引言 在数字音乐时代&#xff0c;许多平台如音乐有榜单&#xff0c;限制非付费用户访问高音质或独家内容。然而&#xff0c;从技术研究的角度来看&#xff0c;我们可以通过逆向工程和Python爬虫技术解音乐的API接口&#xff0c;获取付费音乐的播放链接。 2. 技术准备 在当…...

JVM 垃圾回收器

以下是对主流 JVM 垃圾回收器的详细解析&#xff0c;涵盖 一、Serial GC&#xff08;单线程串行回收器&#xff09; 二、Parallel GC&#xff08;吞吐量优先回收器&#xff09; 三、CMS&#xff08;Concurrent Mark Sweep&#xff0c;低延迟回收器&#xff09; 四、G1&…...