【代码规范】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 API
JAVA并发编程JUC包之CAS原理
在JDK 1.5之后,Java API引入了`java.util.concurrent`包(简称JUC包),提供了多种并发工具类,如原子类`AtomicXX`、线程池`Executors`、信号量`Semaphore`、阻塞队列等。这些工具类简化了并发编程的复杂度。原子类`Atomic`尤其重要,它提供了线程安全的变量更新方法,支持整型、长整型、布尔型、数组及对象属性的原子修改。结合`volatile`关键字,可以实现多线程环境下共享变量的安全修改。
|
1天前
|
存储 Java
JAVA并发编程AQS原理剖析
很多小朋友面试时候,面试官考察并发编程部分,都会被问:说一下AQS原理。面对并发编程基础和面试经验,专栏采用通俗简洁无废话无八股文方式,已陆续梳理分享了《一文看懂全部锁机制》、《JUC包之CAS原理》、《volatile核心原理》、《synchronized全能王的原理》,希望可以帮到大家巩固相关核心技术原理。今天我们聊聊AQS....
|
1天前
|
Java 程序员 数据库连接
Java编程中的异常处理:从基础到进阶
【9月更文挑战第18天】在Java的世界里,异常处理是每个程序员必须面对的挑战。本文将带你从异常的基本概念出发,通过实际的代码示例,深入探讨如何有效地管理和处理异常。我们将一起学习如何使用try-catch块来捕捉异常,理解finally块的重要性,以及如何自定义异常类来满足特定需求。无论你是初学者还是有经验的开发者,这篇文章都将为你提供新的见解和技巧,让你的Java代码更加健壮和可靠。
|
1天前
|
Java 数据库连接 UED
掌握Java编程中的异常处理
【9月更文挑战第18天】在Java的世界中,异常是那些不请自来的客人,它们可能在任何时候突然造访。本文将带你走进Java的异常处理机制,学习如何优雅地应对这些突如其来的“访客”。从基本的try-catch语句到更复杂的自定义异常,我们将一步步深入,确保你能够在面对异常时,不仅能够从容应对,还能从中学到宝贵的经验。让我们一起探索如何在Java代码中实现健壮的异常处理策略,保证程序的稳定运行。
|
2天前
|
Java 数据库
JAVA并发编程-一文看懂全部锁机制
曾几何时,面试官问:java都有哪些锁?小白,一脸无辜:用过的有synchronized,其他不清楚。面试官:回去等通知! 今天我们庖丁解牛说说,各种锁有什么区别、什么场景可以用,通俗直白的分析,让小白再也不怕面试官八股文拷打。
|
2天前
|
Java
深入理解Java中的多线程编程
本文将探讨Java多线程编程的核心概念和技术,包括线程的创建与管理、同步机制以及并发工具类的应用。我们将通过实例分析,帮助读者更好地理解和应用Java多线程编程,提高程序的性能和响应能力。
15 4
|
2天前
|
安全 Java 开发者
Java并发编程中的锁机制解析
本文深入探讨了Java中用于管理多线程同步的关键工具——锁机制。通过分析synchronized关键字和ReentrantLock类等核心概念,揭示了它们在构建线程安全应用中的重要性。同时,文章还讨论了锁机制的高级特性,如公平性、类锁和对象锁的区别,以及锁的优化技术如锁粗化和锁消除。此外,指出了在高并发环境下锁竞争可能导致的问题,并提出了减少锁持有时间和使用无锁编程等策略来优化性能的建议。最后,强调了理解和正确使用Java锁机制对于开发高效、可靠并发应用程序的重要性。
12 3
|
1天前
|
安全 Java 调度
Java 并发编程中的线程安全和性能优化
本文将深入探讨Java并发编程中的关键概念,包括线程安全、同步机制以及性能优化。我们将从基础入手,逐步解析高级技术,并通过实例展示如何在实际开发中应用这些知识。阅读完本文后,读者将对如何在多线程环境中编写高效且安全的Java代码有一个全面的了解。
|
1天前
|
Java
JAVA并发编程ReentrantLock核心原理剖析
本文介绍了Java并发编程中ReentrantLock的重要性和优势,详细解析了其原理及源码实现。ReentrantLock作为一种可重入锁,弥补了synchronized的不足,如支持公平锁与非公平锁、响应中断等。文章通过源码分析,展示了ReentrantLock如何基于AQS实现公平锁和非公平锁,并解释了两者的具体实现过程。
|
1天前
|
Kubernetes Cloud Native Java
探索未来编程新纪元:Quarkus带你秒建高性能Kubernetes原生Java应用,云原生时代的技术狂欢!
Quarkus 是专为 Kubernetes 设计的全栈云原生 Java 框架,凭借其轻量级、快速启动及高效执行特性,在 Java 社区脱颖而出。通过编译时优化与原生镜像支持,Quarkus 提升了应用性能,同时保持了 Java 的熟悉度与灵活性。本文将指导你从创建项目、编写 REST 控制器到构建与部署 Kubernetes 原生镜像的全过程,让你快速上手 Quarkus,体验高效开发与部署的乐趣。
8 0