首先,我们先看一个报这个FindBugs的错误例子。
Collections.sort(listGroup, new Comparator<AttachmentGroup>() {
@Override
public int compare(AttachmentGroup o1, AttachmentGroup o2) {
return codeList.indexOf(o1.getCode()) - codeList.indexOf(o2.getCode());
}
});
如果是jdk1.8以下,那么这么写是没有问题的,可是jdk1.8开始支持使用兰布达表达式,这个写法在扫Sonar时就会报问题。
我们来看代码,Comparator是个接口。上课的时候老师说过,接口是不可以实例化的,那这个写法是为什么呢?
原来这个接口是一个函数式接口。如果一个接口只有一个方 法,则编译器会认为这就是一个函数式接口,可以用注解@FunctionalInterface来显示的表示。
这种直接实例化接口的方式其实并不是直接实例化接口,而是创建了一个内部匿名类来实现了这个接口。同时由于实现类必须实现接口的所有方法,所以需要在代码块中写上接口实现的业务逻辑。所以接口不能被实例化的理论还是成立的。
由于这是一个函数式接口,所以这时可以使用Lambda表达式来表示该接口的一个实现。
Lambda表达式怎么写,可以通过你的函数式接口直接去百度,除了自定义的接口,一共也就十几种。
今天我来介绍一种能够不使用兰布达表达式改正这个Sonar的方法。
首先,写一个类实现该接口,然后为这个实现类写构造方法,传入需要处理逻辑的参数,然后在实现类中实现该接口所有的方法。写上自己的逻辑。
public class AttGroupComparatorImpl implements Comparator<AttachmentGroup> {
private List<String> codeList;
public AttGroupComparatorImpl(List<String> codes) {
codeList = codes;
}
@Override
public int compare(AttachmentGroup o1, AttachmentGroup o2) {
return codeList.indexOf(o1.getCode()) - codeList.indexOf(o2.getCode());
}
}
然后,外部引用只要实例化这个实现类即可。
new AttGroupComparatorImpl(codeList)
如果你还有其他的看法或者想法,欢迎在评论区留下你的意见,大家一起讨论,一起进步,做一只有梦想的网虫!