【代码规范】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日志并进行多维度分析。
目录
相关文章
|
9天前
|
设计模式 安全 Java
Java编程中的单例模式:理解与实践
【10月更文挑战第31天】在Java的世界里,单例模式是一种优雅的解决方案,它确保一个类只有一个实例,并提供一个全局访问点。本文将深入探讨单例模式的实现方式、使用场景及其优缺点,同时提供代码示例以加深理解。无论你是Java新手还是有经验的开发者,掌握单例模式都将是你技能库中的宝贵财富。
14 2
|
4天前
|
JSON Java Apache
非常实用的Http应用框架,杜绝Java Http 接口对接繁琐编程
UniHttp 是一个声明式的 HTTP 接口对接框架,帮助开发者快速对接第三方 HTTP 接口。通过 @HttpApi 注解定义接口,使用 @GetHttpInterface 和 @PostHttpInterface 等注解配置请求方法和参数。支持自定义代理逻辑、全局请求参数、错误处理和连接池配置,提高代码的内聚性和可读性。
|
6天前
|
安全 Java 编译器
JDK 10中的局部变量类型推断:Java编程的简化与革新
JDK 10引入的局部变量类型推断通过`var`关键字简化了代码编写,提高了可读性。编译器根据初始化表达式自动推断变量类型,减少了冗长的类型声明。虽然带来了诸多优点,但也有一些限制,如只能用于局部变量声明,并需立即初始化。这一特性使Java更接近动态类型语言,增强了灵活性和易用性。
87 53
|
1天前
|
SQL 存储 Java
面向 Java 程序员的 SQLite 替代品
SQLite 是轻量级数据库,适用于小微型应用,但其对外部数据源支持较弱、无存储过程等问题影响了开发效率。esProc SPL 是一个纯 Java 开发的免费开源工具,支持标准 JDBC 接口,提供丰富的数据源访问、强大的流程控制和高效的数据处理能力,尤其适合 Java 和安卓开发。SPL 代码简洁易懂,支持热切换,可大幅提高开发效率。
|
6天前
|
存储 安全 Java
Java多线程编程的艺术:从基础到实践####
本文深入探讨了Java多线程编程的核心概念、应用场景及其实现方式,旨在帮助开发者理解并掌握多线程编程的基本技能。文章首先概述了多线程的重要性和常见挑战,随后详细介绍了Java中创建和管理线程的两种主要方式:继承Thread类与实现Runnable接口。通过实例代码,本文展示了如何正确启动、运行及同步线程,以及如何处理线程间的通信与协作问题。最后,文章总结了多线程编程的最佳实践,为读者在实际项目中应用多线程技术提供了宝贵的参考。 ####
|
2天前
|
监控 安全 Java
Java中的多线程编程:从入门到实践####
本文将深入浅出地探讨Java多线程编程的核心概念、应用场景及实践技巧。不同于传统的摘要形式,本文将以一个简短的代码示例作为开篇,直接展示多线程的魅力,随后再详细解析其背后的原理与实现方式,旨在帮助读者快速理解并掌握Java多线程编程的基本技能。 ```java // 简单的多线程示例:创建两个线程,分别打印不同的消息 public class SimpleMultithreading { public static void main(String[] args) { Thread thread1 = new Thread(() -> System.out.prin
|
5天前
|
存储 缓存 安全
在 Java 编程中,创建临时文件用于存储临时数据或进行临时操作非常常见
在 Java 编程中,创建临时文件用于存储临时数据或进行临时操作非常常见。本文介绍了使用 `File.createTempFile` 方法和自定义创建临时文件的两种方式,详细探讨了它们的使用场景和注意事项,包括数据缓存、文件上传下载和日志记录等。强调了清理临时文件、确保文件名唯一性和合理设置文件权限的重要性。
13 2
|
6天前
|
Java UED
Java中的多线程编程基础与实践
【10月更文挑战第35天】在Java的世界中,多线程是提升应用性能和响应性的利器。本文将深入浅出地介绍如何在Java中创建和管理线程,以及如何利用同步机制确保数据一致性。我们将从简单的“Hello, World!”线程示例出发,逐步探索线程池的高效使用,并讨论常见的多线程问题。无论你是Java新手还是希望深化理解,这篇文章都将为你打开多线程的大门。
|
6天前
|
安全 Java 编译器
Java多线程编程的陷阱与最佳实践####
【10月更文挑战第29天】 本文深入探讨了Java多线程编程中的常见陷阱,如竞态条件、死锁、内存一致性错误等,并通过实例分析揭示了这些陷阱的成因。同时,文章也分享了一系列最佳实践,包括使用volatile关键字、原子类、线程安全集合以及并发框架(如java.util.concurrent包下的工具类),帮助开发者有效避免多线程编程中的问题,提升应用的稳定性和性能。 ####
28 1
|
9天前
|
设计模式 安全 Java
Java编程中的单例模式深入解析
【10月更文挑战第31天】在编程世界中,设计模式就像是建筑中的蓝图,它们定义了解决常见问题的最佳实践。本文将通过浅显易懂的语言带你深入了解Java中广泛应用的单例模式,并展示如何实现它。