根据项目整体代码检查结果,记录一下,有了这玩意,代码规范问题多犯犯错误,以后就没毛病了啊~
1.不要使用SimpleDataFormat,它是线程不安全的类,可能导致线程安全问题,慎用
--可以使用DateTimeFormatter
代替SimpleDateFormat 原文地址,可以点这里
2.闲置不用
的存储,包含无效变量,无效引用应该删除
闲置存储是给本地变量赋值,这个值可能是null或者在后续处理中不被使用的。计算或者返回一个只用于重写的或者抛弃的的变量
,可能引起中的错误。即使不发生错误,也是非常浪费系统资源的。
正确示例
public void pow(int a, int b) {
if(b == 0) {
return 0;
}
int x = a;
for(int i= 1, i < b, i++) {
x = x * a;
}
return x;
}
错误示例
public void pow(int a, int b) {
if(b == 0) {
return 0;
}
int x = a;
for(int i= 1, i < b, i++) {
x = x * a; //Dead store because the last return statement should return x instead of returning a
}
return a;
}
3.switch块不可缺少default语句,另外switch块中每个case都应通过break/return来终止
4.不要调用Throwable.printStackTrace(...)
Throwable.printStackTrace(...) 会打印输出Throwable及其堆栈跟踪流。 应该使用日志来替代打印Throwable信息: 用户可以很方便查看日志。 日志信息都是统一格式的,用户可以轻松查看。(比如lombok封装好的@Slf4j
)
5."Calendars" 和 "DateFormats" 不能是static类型,并发处理可能会出错
并非所有在标准Java库的类都可以写进安全线程里。以多线程方式使用它们极有可能导致在运行时产生数据问题或异常。static类型意味着该变量属于当前类,很容易在使用时改变当前类对象,从而引起潜在的线程安全问题。 可以把成员声明为final,使其不可被改写。或不声明为static减少线程安全问题发生的几率。 只要下面实例中任何一个标记为static:Calendar、DateFormat、javax.xml.xpath.XPath、javax.xml.validation.SchemaFactory,这条规则就会报错。
6.创建线程或线程池时使用有意义的名称
有意义的线程名称有助于跟踪错误信息,因此在创建线程或线程池时指定名称,看到这个想起之前有小伙伴提醒过我,自定义注入的类名,但是我没听....后面要注意了
7.实例成员不应修改"static"字段
通过非静态的方法更新静态字段很难得到正确的结果
,在多个实例和/或多线程的情况下,很容易导致缺陷。
错误示例
public class MyClass {
private static int count = 0;
public void doSomething() {
//...
count++; // Noncompliant
}
}
8.数组转集合用流
UnsupportedOperationException这个还真亲身经历过这个错误,Arrays中的asList(arr) 可将数组转集合,但是进行删除和添加会发生UnsupportedOperationException。
具体原因是 : 由于Arrays.asList() 返回的是Arrays的内部类ArrayList
, 而不是java.util.ArrayList
。Arrays的内部类ArrayList和java.util.ArrayList都是继承AbstractList
,remove、add等方法AbstractList
中这些方法调用后是默认throw UnsupportedOperationException
而且不作任何操作。java.util.ArrayList重新了这些方法而Arrays的内部类ArrayList没有重新,所以会抛出异常。源码分析可以看:https://blog.csdn.net/qq_39416311/article/details/83688591
**推荐: **对于数组转list我们可以采用更安全方式,比如下面 一个名为result的List
result.stream().map(SecuritiesInfoSearchResp::getUniqueCode).collect(Collectors.toList());
或者我们可以:
List<String> list = Arrays.asList(array);
List arrList = new ArrayList(list);
steam():把一个源数据(集合,数组,I/O channel, 产生器generator 等)转化成流。
https://www.runoob.com/java/java8-streams.html
网友评论