Java - 你的 Java 代码有这些坏味道吗?
列举一些 Java 开发中常见的“不良实践”,来源于代码扫描(https://github.com/pmd/pmd),和诸君一起学习参考:
1 - 关闭资源
CloseResource: Ensure that resources like this FileInputStream object are closed after use.
确保 FileInputStream、HttpClient 之类的对象在使用后被及时关闭。
JDK 1.8 开始建议使用 try-with-resource
关闭资源,因为对于多个资源或异常的捕获中,try-finally 可能丢失掉前面的异常,而 try-with-resource 会保留第一个异常,并把后续的异常作为Suppressed exceptions,可通过 getSuppressed()
返回的数组来检验。
try-with-resource 示例:
try (FileReader fileReader = new FileReader(filePath);
BufferedReader bfReader = new BufferedReader(fileReader)) {
// do something
}
2 - 松耦合
LooseCoupling: Avoid using implementation types like 'ArrayList', use the interface instead.
避免使用具体的实现类型,比如“ArrayList”,而是使用它们的接口,比如:
// 这种方法不好:
public ArrayList<String> getList() {
ArrayList<String> list = new ArrayList<String>();
// do something
return list;
}
// 建议这样用:
public List<String> getList() {
List<String> list = new ArrayList<String>();
// do something
return list;
}
第二种写法的优点是,这个方法的调用者不必关注方法内部到底使用了哪个 List<String>
的具体实现,并且就算方法内部的实现发生了变化,调用方也不需要修改自己的代码。
3 - 避免捕获NPE
AvoidCatchingNPE - Avoid catching NullPointerException, consider removing the cause of the NPE.
避免捕获空指针异常,考虑删除相关的捕获语句,并在代码中进行空引用的检查。
程序在运行期抛出 NullPointException 异常,表明存在一个对空指针的解引用,这类问题应该在代码中解决。
通过捕获 NullPointException 异常而不对根本原因进行处理是不合适的:
1)捕获 NullPointException 而不是作简单的空引用检查,在性能上要付出更大的代价;
2)当 try 程序段中多个表达式都有可能抛出 NullPointException 时,无法正确判断异常的抛出位置;
3)程序抛出 NullPointException 异常很少会处于正常的可用状态。
4 - 使用 equals() 方法来比较 String 类型
UseEqualsToCompareStrings - Use equals() to compare strings instead of '==' or '!='.
使用 equals() 方法对 String 类型进行比较,而不是用 “==” 或 “!=”。
这是为了防止比较的对象是通过 new String("") 构造的,== 比较的是对象的地址,要注意这点。
5 - 使用 “==” 判断实例是否为 null
EqualsNull - Avoid using equals() to compare against null.
使用 “==” 判断实例是否为 null ,如:str == null
,而不是 str.equals(null)
。
6 - 避免打印堆栈信息
AvoidPrintStackTrace - Avoid printStackTrace(), use a logger call instead.
避免使用 printStackTrace()
方法直接打印堆栈,而是要使用日志框架打印堆栈信息。
7 - Integer 类型的初始化
IntegerInstantiation - Avoid instantiating Integer objects. Call Integer.valueOf() instead.
避免通过 new Integer(param)
直接创造 Integer 对象,推荐用:Integer.valueOf(param)
的方法来创建。
如果是 String 类型的参数,推荐用 Integer.parseInt()
方法,解析生成对应的数值类型,更高效。
其他类型(比如 Boolean\Long、 Double)的解析,修改方式和 Integer 相同。
8 - Boolean 类型的初始化
BooleanInstantiation - Avoid instantiating Boolean objects; reference Boolean.TRUE or Boolean.FALSE or call Boolean.valueOf() instead.
避免创建 Bool 类型的对象,比如 new Boolean(false)
,建议使用全局的 Boolean 实例。
由于 Boolean 类型就只有 1 / 0 两种状态,因此建议通过 Boolean.TRUE
或 Boolean.FALSE
,或 Boolean.valueOf()
来使用。
参考资料
版权声明
出处:博客园-瘦风的南墙(https://www.cnblogs.com/shoufeng)
感谢阅读,公众号 「瘦风的南墙」 ,手机端阅读更佳,还有其他福利和心得输出,欢迎扫码关注
本文版权归博主所有,欢迎转载,但 [必须在页面明显位置标明原文链接],否则博主保留追究相关人士法律责任的权利。
Java - 你的 Java 代码有这些坏味道吗?的更多相关文章
- 代码重构 & 代码中的坏味道
1.重构 1.1 为什么要重构 1.1.1 改进程序设计 程序员为了快速完成任务,在没有完全理解整体架构之前就开始写代码, 导致程序逐渐失去自己的结构.重构则帮助重新组织代码,重新清晰的体现 程序结构 ...
- 避免 Java 代码中的“坏味道”
1.需要 Map 的主键和取值时,应该迭代 entrySet() 当循环中只需要 Map 的主键时,迭代 keySet() 是正确的.但是,当需要主键和取值时,迭代 entrySet() 才是更高效的 ...
- 在PHP中避免一些代码中的坏味道
做PHP开发已经有快一年的时间了,在这一年的时间中,学习了很多生产环境中的技巧,学习了很多东西,期间也阅读了一些优秀的源码和关于代码的书,对写代码这一块有了一定的思考,也看过很多别人写的好的代码和坏的 ...
- 消灭 Java 代码的“坏味道”
消灭 Java 代码的“坏味道” 原创: 王超 阿里巴巴中间件 昨天 导读 明代王阳明先生在<传习录>谈为学之道时说: 私欲日生,如地上尘,一日不扫,便又有一层.着实用功,便见道无终穷,愈 ...
- 吐槽一下项目中的代码坏味道:滥用java常量
我们的项目中是否充斥着类似以下的代码呢?定义一个专门存放常量的java类(接口),非常多其它类依赖该常量类. public interface IConstant { int ZERO = 0; St ...
- 第二节:Java入门第一行代码
前言 大家好,今天带来Java入门第一行代码的概述,希望你们喜欢 第一行代码 学习Java基础课程,学会使用eclipse,eclipse为Java集成开发坏境IDE,创建第一个Java源文件代码: ...
- (转载)JAVA动态编译--字节代码的操纵
在一般的Java应用开发过程中,开发人员使用Java的方式比较简单.打开惯用的IDE,编写Java源代码,再利用IDE提供的功能直接运行Java 程序就可以了.这种开发模式背后的过程是:开发人员编写的 ...
- 转:java怎么用一行代码初始化ArrayList
java怎么用一行代码初始化ArrayList 您可以创建一个工厂方法: public static ArrayList<String> createArrayList(String .. ...
- 意外作出了一个javascript的服务器,可以通过js调用并执行任何java(包括 所有java 内核基本库)及C#类库,并最终由 C# 执行你提交的javascript代码! 不敢藏私,特与大家分
最近研发BDC 云开发部署平台的数据路由及服务管理器意外作出了一个javascript的服务器,可以通过js调用并执行任何java(包括 所有java 内核基本库)及C#类库,并最终由 C# 执行你提 ...
随机推荐
- Servlet、ServletContext与ServletConfig的详解及区别
Servlet.ServletContext与ServletConfig的详解及区别 一.Servlet详解 Servlet是一个interface,全局限定名:javax.servlet.Servl ...
- spring-data-redis 连接泄漏,我 TM 人傻了
本系列是 我TM人傻了 系列第四期[捂脸],往期精彩回顾: 升级到Spring 5.3.x之后,GC次数急剧增加,我TM人傻了 这个大表走索引字段查询的 SQL 怎么就成全扫描了,我TM人傻了 获取异 ...
- C# 使用正则表达式替换PPT中的文本(附vb.net代码)
文本介绍如何在C#程序中使用正则表达式替换PPT幻灯片中的指定文本内容.具体操作步骤如下: 1. 在程序中引用Spire.Presentation.dll.两种方法可参考如下: (1)直接在程序中通过 ...
- 高德渲染网关Go语言重构实践
1.导读 高德启动Go业务建设已经有段时间了,主要包含Go应用落地,Go中间件建设,云原生三个部分.经过持续的发力,在这些方面取得了不错的进展.高德Go业务落地过程是如何实现的,遇到过哪些问题,如何 ...
- 25道经典Java算法题
题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? //这是一个菲波拉契数列问题 [Java] 纯 ...
- 一个double free相关问题的澄清
引言 前一阵定位 Oracle 的 OCI 接口相关的一个内存释放问题,在网上看到了链接如下的这篇文章: 一个C++bug引入的许多知识 看到后面说 vector 里的两个单元里的内部成员指针地址是一 ...
- linux centos7 移动文件到指定目录
2021-08-26 在 centos7 环境下怎么移动一个文件到其他的目录下呢? 使用命令 mv 文件名 指定目录 即可完成该操作. 那么怎么将一个文件夹下的内容移动到另一个文件夹下呢?比如有时 ...
- 堆栈相关的经典题(c++)
1.定义队列 typedef struct node{ int data; struct node * next; }Node; typedef struct linkQueue { Node * f ...
- Git使用教程四
拉取线上仓库 :git pull 提醒: 在每天工作的第一件事就是先git pull拉取线上最新·的版本: 每天下班前要做的是git push,将本地代码提交到线上仓库. 有兴趣可以关注一下微信公众号
- 【SpringMVC】文件上传与下载、拦截器、异常处理器
文件下载 使用ResponseEntity实现下载文件的功能 index.html <!DOCTYPE html> <html lang="en" xmlns:t ...