我有一个问题让SonarQube对规则感到高兴:
Lambdas应该用方法引用替换(squid:S1612)
示例代码:
我的一个实体类,里面有一个构建器模式:
public class Person {
Integer id;
String name;
public Person id(Integer id) {
setId(id);
return this;
}
public Person name(String name) {
setName(name);
return this;
}
/*
* Constructors, getters, setters etc...
*/
}
我的Simplifier类,它创建了一个只有id填充的实体的简化版本:
public class Simplifier<E> {
private final Function<Integer, E> creator;
public Simplifier(Function<Integer, E> entityCreator) {
this.creator = entityCreator;
}
public E simplify(Integer id) {
return creator.apply(id);
}
}
我的Simplifiers类为我的entites提供了所有可用的简化器。这里有两个例子,一个是单行lambda和多行lambda:
public class Simplifiers {
public static final Simplifier<Person> PERSON_1 =
new Simplifier<>(id -> new Person().id(id));
public static final Simplifier<Person> PERSON_2 =
new Simplifier<>(
id -> {
final Person action2 = new Person();
return action2.id(id);
});
}
我的问题是SonarQube抱怨PERSON_1 lambda。如何编写它以便它是方法参考?
请注意,这种语法在逻辑上并不相同:
public static final Simplifier<Person> PERSON_3 =
new Simplifier<>(new Person()::id);
对于所有对PERSON_3简化的调用,只会创建一个Person实例,因此这样的测试用例将失败:
public class SimplifierTest {
@Test
public void test() {
Person simpleP1 = Simplifiers.PERSON_3.simplify(1);
Person simpleP2 = Simplifiers.PERSON_3.simplify(2);
Assert.assertNotSame(simpleP1, simpleP2);
}
}