1、应使用“equals()”比较字符串和盒装类型
比较java.lang.String或盒装类型的两个实例(例如java.lang.Integer使用引用相等性==或!=)几乎总是错误的,因为它不是比较实际值,而是比较内存中的位置。
案例:
改造:
!repeat.equals(xmdm)
2、不应取消引用空指针
null不应该被取消引用/访问。这样做会导致抛出NullPointerException。一般情况下,这样的异常会导致程序突然终止。在最坏的情况下,它可能会暴露对攻击者有用的调试信息,或者它可能允许攻击者绕过安全措施。
案例:
3、不应使用“BigDecimal(double)”
由于浮点不精确,您不太可能从BigDecimal(double)构造函数中获得您期望的值。相反,您应该使用BigDecimal.valueOf,它使用隐藏的字符串来消除浮点舍入错误,或者使用带String参数的构造函数。
案例:
改造:
BigDecimal.valueOf(0.00)
或:
new BigDecimal(“0.00")
4、资源应该关闭
实现Closeable接口或其超接口的连接、流、文件和其他类AutoCloseable在使用后需要关闭。此外,该close调用必须在finally块中进行,否则异常可能会阻止调用。最好,当类实现AutoCloseable时,资源应该使用“try-with-resources”模式创建并自动关闭。
未能正确关闭资源将导致资源泄漏,这可能导致应用程序崩溃。
案例:
改造:
添加finally关闭
或:使用“try-with-resources”模式创建可以自动关闭
5、不应在基于值的类的实例上进行同步
池化和可能重用的对象不应用于同步锁。如果是,则可能会导致无关线程因无用的堆栈跟踪而死锁。具体来说,String和装箱基本类型(如整数)不应用作锁定对象,因为它们是池化和重用的。
案例:
改造:
6、应重构最多包含一次迭代的循环
最多一次迭代的循环相当于使用一条if语句有条件地执行一段代码。没有开发人员期望找到循环语句的这种用法。如果作者的初衷真的是有条件地执行一段代码,那么if应该使用语句来代替。
案例:
7、不应该进行愚蠢的平等性检查
不同类型的比较将始终返回 false。可以简单地删除比较及其所有相关代码。这包括:
1、将对象与 null 进行比较
2、将一个对象与一个不相关的基元进行比较(例如一个带有 int 的字符串)
3、比较不相关的类
4、比较一个不相关的class和interface
5、比较不相关的interface类型
6、将数组与非数组进行比较
7、比较两个数组
案例: