【代码规范】Java程序员的编程笔记(培养好习惯)

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 分享优秀的Java编程好习惯!欢迎打卡学习!
【辰兮要努力】:hello你好我是辰兮,很高兴你能来阅读,昵称是希望自己能不断精进,向着优秀程序员前行!

博客来源于项目以及编程中遇到的问题总结,偶尔会有读书分享,我会陆续更新Java前端、后台、数据库、项目案例等相关知识点总结,感谢你的阅读和关注,希望我的博客能帮助到更多的人,分享获取新知,大家一起进步!

吾等采石之人,应怀大教堂之心,愿大家奔赴在各自的热爱里…

一、注释清晰

每个类、方法都写清楚注释 且行注释应该在代码之前另起一行

备注如下是Java方法里面的注释模板

   /**
     * 功能描述: 
     *
     * @param 方法参数的说明
     * @return 对方法返回值的说明
     * @author 模块的作者
     * @date 编写日期
     */

普通实体类的注解

/**
 * @author: 辰兮要努力
 * @createDate: 2021-8-8 11:56:10
 * @description: Java编程反思
 */

注释可以很好的帮助后续要维护,拓展你代码的人阅读

【强制】类、类属性、类方法的注释必须使用Javadoc规范,使用/*内容/格式,不得使用//xxx方式。

说明:在IDE编辑窗口中,Javadoc方式会提示相关注释,生成Javadoc可以正确输出相应注释;在IDE中,工程调用方法时,不进入方法即可悬浮提示方法、参数、返回值的意义,提高阅读效率。

更多详细的学习可以参考阿里巴巴java开发手册详解-编程规约 -注释规约


二、命名规范

开发前期一定要培养自己的好习惯,要思考如何让代码写好

具体包括方法,类名以及变量名等

最常见的基础方法如下,命名中不要出现中英文拼接或者中文拼音的情况,可以百度一下对应的英文翻译,命名要正规

Service/DAO层方法命名规约
1) 获取单个对象的方法用get做前缀。
2) 获取多个对象的方法用list做前缀。
3) 获取统计值的方法用count做前缀。
4) 插入的方法用save(推荐)或insert做前缀。
5) 删除的方法用remove(推荐)或delete做前缀。
6) 修改的方法用update做前缀
领域模型命名规约
1) 数据对象:xxxDO,xxx即为数据表名。
2) 数据传输对象:xxxDTO,xxx为业务领域相关的名称。
3) 展示对象:xxxVO,xxx一般为网页名称。
4) POJO是DO/DTO/BO/VO的统称,禁止命名成xxxPOJO

举几个简单的案例

【强制】 代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束

反例: name / __name / $Object / name / name$ / Object$

【强制】 代码中的命名严禁使用拼音与英文混合的方式,更不允许直接使用中文的方式。

反例: DaZhePromotion [打折] / getPingfenByName() [评分] / int 某变量 = 3
正例: alibaba / taobao / youku / hangzhou 等国际通用的名称,可视同英文。

【强制】类名使用 UpperCamelCase 风格,必须遵从驼峰形式,但以下情形例外:(领域模型 的相关命名)DO / BO / DTO / VO等。

正例:MarcoPolo / UserDO / XmlService / TcpUdpDeal / TaPromotion
反例:macroPolo / UserDo / XMLService / TCPUDPDeal / TAPromotion

【强制】方法名、参数名、成员变量、局部变量都统一使用 lowerCamelCase 风格,必须遵从驼峰形式。

正例: localValue / getHttpMessage() / inputUserId

【参考】枚举类名建议带上 Enum 后缀,枚举成员名称需要全大写,单词间用下划线隔开。

说明: 枚举其实就是特殊的常量类,且构造方法被默认强制是私有。

正例: 枚举名字:DealStatusEnum,成员名称: SUCCESS / UNKOWN_REASON。

备注:枚举全部大写即可,在项目中要巧用枚举

枚举学习参考:一篇文章彻底读懂Java枚举Enum类(案例详解)


三、入参校验

入参校验,普通的常量和集合的判空

在Java的Service层的实现类中,一定要有完善的入参校验

部分公司DAO层也是自己封装的框架,所以单独拿出来也要有自己的入参校验

普通字符串的入参校验

StringUtils.isEmpty(String str) 判断某字符串是否为空,为空的标准是 str==null 或 str.length()==0
StringUtils.isBlank(String str) 判断某字符串是否为空或长度为0或由空白符(whitespace) 构成
System.out.println(StringUtils.isEmpty("   "));       //false
System.out.println(StringUtils.isBlank("   "));       //true

集合的入参校验

判断list集合不能为空

CollectionUtils.isEmpty(list)

如下的判断方法也可以,不过我更建议使用如上集合帮助类,简介清晰

if(null == list || list.size() ==0 ){
 
  //为空的情况
   
}else{
 
  //不为空的情况
 
}

在service层的第一步就应该是入参校验,如果传入参数有问题,直接返回对应的错误提示,这样也可以提高接口的响应速度


四、日志清晰

有效的输出日志,比如抛出异常,打印有效的参数更好的帮助我们解决异常的问题

日志的案例:使用参数化形式{}占位,[]进行参数隔离

 logger.debug("Processing trade with param1:[{}] and param2: [{}] ", param1, param2); 

不推荐使用

logger.debug("Processing trade with param1: " + param1 + " param2: " + param2);

异常添加对应的日志外,部分逻辑比较复杂的接口,我们需要详细的了解具体走到哪里出问题了,入参等是否进入都可以添加对应的日志,方便我们阅读


常见错误总结

1、不要抛出异常后又输出日志,不然会造成重复输出日志。

try {
    // ...
} catch (Exception e) {
    // 错误案例 
    LOG.error("xxx", e);
    throw new RuntimeException();
}

2、不要使用错了日志的级别

try {
    // ...
} catch (Exception e) {
    // 错误案例- 如果捕获异常就写error
    LOG.info("XX 发生异常...", e);
}

正常打印日志记录入参,出参就用info,错误日志就用error


五、返参清晰

及时的输出返回值,同时msg里面的信息要准确和清晰

    /** 状态码 */
    public static final String CODE_TAG = "code";

    /** 返回内容 */
    public static final String MSG_TAG = "msg";

    /** 数据对象 */
    public static final String DATA_TAG = "data";

比如传入的人员ID不能为空; 比如未配置文件存储服务器等;

如上的清晰描述可以让前后端在联调或者线上出现操作问题的时候更好的排查问题

很多时候不要直接返回一个服务端错误,能写清楚就写清楚


六、常量提取

常量类:常量等要提取出来,创建常量类、避免魔法值的使用

阿里强制规定不允许任何魔法值(未经定义的常量)直接出现在代码中

---

提取的好处分享

当我们常量提取后:如定义了一个公共的试题类型编号COMMON

当我们后台再做逻辑操作的时候,只要引用这一个同样的常量即可

    /**
     * 公共的试题类型编号
     */
    public static final String TYPE = "COMMON";

此时后面所有service层逻辑中引用都可以直接使用这一个定义的常量,如果此时因为某种特殊原因我将公共的试题类型编号修改为“COMMON_CODE”,这样也只需要在此处一个地方修改即可;

如上的操作提高了的代码的拓展性和复用性; 不然我要全局搜索哪里用到了公共试题这个编号,然后一个个修改;


七、方法复用

帮助类:可以统一复用的方法要写在帮助类中,统一的复用;

如日期的帮助类,获取IP的帮助类,文件上传的公共类等等…
![在这
能统一抽出来复用的类就统一抽出来


Java逻辑层中同样抽离公共方法复用

同样Java中service层的逻辑代码里面两个业务封装逻辑相同的方法能复用的地方就抽离出来

如查询热门帖子和查询最新帖子-逻辑层中封装的点赞,关注,用户状态等的业务逻辑一样,唯一不一样的是底层查询出来一个根据权重查询,一个根据时间查询;

这样我们把封装的方法抽离出来,做成共用的,这样提高了代码的复用性


八、代码美化

代码美化 去掉空白: Ctrl + Shift + J

       格式化代码: Ctrl + Alt + L
       一致的缩进




九、巧用工具

巧妙地使用工具检查代码

idea里面下载工具,搜索框中输入alibaba 选择 Alibaba Java Coding Guidelines,点击 右边的Install按钮进行安装,安装完成之后重启idea

在这里插入图片描述

  <font face="楷体" size=4>找到要扫描的包或者类点击右键

在这里插入图片描述
效果如下:【强制】类、类属性、类方法的注释必须使用Javadoc规范,使用/*内容/格式,不得使用//xxx方式
在这里插入图片描述

当然还有很多其它的代码检测工具,合理使用即可


十、提交规范

提交代码Git或者SVN描述 要清晰; 方便清晰地知道代码提交代码或者修改的内容

feat - 新功能 feature
fix - 修复 bug
docs - 文档注释
style - 代码格式(不影响代码运行的变动)
refactor - 重构、优化(既不增加新功能,也不是修复bug)
perf - 性能优化
test - 增加测试
chore - 构建过程或辅助工具的变动
revert - 回退
build - 打包

参考案例

[feat]-影院管理模块- 功能描述: 新增影院模块首页查询功能

[fix]-影院管理模块- 功能描述: 解决影院模块首页根据区域查询失败的问题

当然上述提交的格式还可以更加的规范,在开发过程跟着项目的提交规范走即可,培养好的习惯,方便阅读代码的人,也方便后续排查问题


请添加图片描述

当我们书写代码的时候就要思考如何把代码写好,而不仅仅是完成!

上述总结还有很多待完善的地方,仅供参考,后续会不断的反思和完善自己的思维!争取成为一个合格的开发工程师!

期待有更多的进步!

---

非常感谢你阅读到这里,如果这篇文章对你有帮助,希望能留下你的点赞👍 关注❤️ 分享👥 留言💬thanks!!!

2021年8月29日22:13:35 愿你们奔赴在自己的热爱里!

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
2天前
|
Java 调度 开发者
Java并发编程:深入理解线程池
在Java的世界中,线程池是提升应用性能、实现高效并发处理的关键工具。本文将深入浅出地介绍线程池的核心概念、工作原理以及如何在实际应用中有效利用线程池来优化资源管理和任务调度。通过本文的学习,读者能够掌握线程池的基本使用技巧,并理解其背后的设计哲学。
|
3天前
|
安全 Java 关系型数据库
代码规范Java阿里巴巴
本文介绍了阿里巴巴的《Java开发手册》,这是一份业界公认的代码规范手册,涵盖编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约七个维度。手册通过强制、推荐、参考三大类规约,详细指导开发者编写高质量的Java代码。文中还提供了常见问题的正反例对比,如方法参数类型一致性、SimpleDateFormat线程安全等问题的解决方案。此外,还介绍了如何安装和使用阿里规范插件来提高编码效率。
32 9
|
2天前
|
缓存 Java 编译器
JAVA并发编程synchronized全能王的原理
本文详细介绍了Java并发编程中的三大特性:原子性、可见性和有序性,并探讨了多线程环境下可能出现的安全问题。文章通过示例解释了指令重排、可见性及原子性问题,并介绍了`synchronized`如何全面解决这些问题。最后,通过一个多窗口售票示例展示了`synchronized`的具体应用。
|
6天前
|
Java 开发者
【Java编程新纪元】JDK 22:超级构造函数来袭,super(...) 前导语句改写编程规则!
【9月更文挑战第6天】JDK 22的超级构造函数特性是Java编程语言发展史上的一个重要里程碑。它不仅简化了代码编写,还提升了代码的可读性和维护性。我们有理由相信,在未来的Java版本中,还将有更多令人兴奋的新特性等待我们去发现和应用。让我们共同期待Java编程新纪元的到来!
|
6天前
|
Oracle Java 关系型数据库
【颠覆性升级】JDK 22:超级构造器与区域锁,重塑Java编程的两大基石!
【9月更文挑战第6天】JDK 22的发布标志着Java编程语言在性能和灵活性方面迈出了重要的一步。超级构造器和区域锁这两大基石的引入,不仅简化了代码设计,提高了开发效率,还优化了垃圾收集器的性能,降低了应用延迟。这些改进不仅展示了Oracle在Java生态系统中的持续改进和创新精神,也为广大Java开发者提供了更多的可能性和便利。我们有理由相信,在未来的Java编程中,这些新特性将发挥越来越重要的作用,推动Java技术不断向前发展。
|
3天前
|
安全 Java 数据安全/隐私保护
- 代码加密混淆工具-Java 编程安全性
在Java编程领域,保护代码安全与知识产权至关重要。本文探讨了代码加密混淆工具的重要性,并介绍了五款流行工具:ProGuard、DexGuard、Jscrambler、DashO 和 Ipa Guard。这些工具通过压缩、优化、混淆和加密等手段,提升代码安全性,保护知识产权。ProGuard 是开源工具,用于压缩和混淆Java代码;DexGuard 专为Android应用程序设计,提供强大加密功能;Jscrambler 基于云,保护Web和移动应用的JavaScript及HTML5代码;DashO 支持多种Java平台和
16 1
|
3天前
|
算法 Java 数据处理
Java并发编程:解锁多线程的力量
在Java的世界里,掌握并发编程是提升应用性能和响应能力的关键。本文将深入浅出地探讨如何利用Java的多线程特性来优化程序执行效率,从基础的线程创建到高级的并发工具类使用,带领读者一步步解锁Java并发编程的奥秘。你将学习到如何避免常见的并发陷阱,并实际应用这些知识来解决现实世界的问题。让我们一起开启高效编码的旅程吧!
|
5天前
|
Java 开发者
Java中的多线程编程基础与实战
【9月更文挑战第6天】本文将通过深入浅出的方式,带领读者了解并掌握Java中的多线程编程。我们将从基础概念出发,逐步深入到代码实践,最后探讨多线程在实际应用中的优势和注意事项。无论你是初学者还是有一定经验的开发者,这篇文章都能让你对Java多线程有更全面的认识。
14 1
|
2天前
|
安全 Java UED
Java并发编程:解锁多线程的潜力
在Java的世界里,并发编程如同一场精心编排的交响乐,每个线程扮演着不同的乐手,共同奏响性能与效率的和声。本文将引导你走进Java并发编程的大门,探索如何在多核处理器上优雅地舞动多线程,从而提升应用的性能和响应性。我们将从基础概念出发,逐步深入到高级技巧,让你的代码在并行处理的海洋中乘风破浪。
|
2天前
|
Java 程序员
Java编程中的对象和类: 初学者指南
【9月更文挑战第9天】在Java的世界中,对象和类构成了编程的基石。本文将引导你理解这两个概念的本质,并展示如何通过它们来构建你的程序。我们将一起探索类的定义,对象的创建,以及它们如何互动。准备好了吗?让我们开始这段Java的旅程吧!