Lambda使用构建器模式时

时间:2018-05-18 13:01:33

标签: java lambda sonarqube

我有一个问题让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);
    }
}

0 个答案:

没有答案