PMD LocalVariableCouldBeFinal остается действительным правилом при работе с коллекцией в лямбда-выражении? - PullRequest
0 голосов
/ 15 мая 2018

Правило PMD, зарегистрированное как LocalVariableCouldBeFinal

У меня есть утилита для получения смежных узлов, которые будут заполняться на основе фильтрации и бизнес-кода.

Код ниже четко сообщает о намерении, что набор будет заполнен позже.

Таким образом, это правило остается в силе? Для любых таких случаев использования коллекции в коде независимо от того, является ли это локальной переменной или нет?

public static Set<String> getAdjacentNodes(final Set<String> nodes) {
    final Set<String> nodesLocal = nodes.stream()
            .map(node -> node.toUpperCase())
            .collect(Collectors.toSet());
    //PMD Complaining on below line of adjacentNodeSet : LocalVariableCouldBeFinal 
    Set<String> adjacentNodeSet = new HashSet<>();
    nodesLocal.stream()
            .forEach(node -> adjacentNodeSet.addAll(getAdjacentNodes(node)));

    Set<String> adjNodeList = adjacentNodeSet
            .stream()
            .filter(nodeId -> !(nodesLocal.contains(nodeId)))
            .collect(Collectors.toSet());

    return adjNodeList;
}

1 Ответ

0 голосов
/ 15 мая 2018

Я ненавижу это правило (может быть, мне пора заняться его отключением и в нашем проекте).Ну, во-первых, в сообщении об ошибке говорится, что может быть окончательным, а не то, что должно быть окончательным, это похоже на крошечную рекомендацию, а не правило как таковое.

Тем более, что ваша переменная фактически окончательная в любом случае, я бы подавил это предупреждение, или лучше (может быть) полностью избавиться от него (не уверен, что PMD позволяет это).

Но вы могли быобойти это с помощью простого рефакторинга:

return nodes.stream()
            .map(String::toUpperCase)
            .flatMap(n -> getAdjacentNodes(n).stream())
            .filter(nodeId -> !(nodes.contains(nodeId.toLowerCase())))
            .collect(Collectors.toSet());
...