【问题标题】:Method used by method reference - recognised as not used方法引用使用的方法 - 识别为未使用
【发布时间】:2017-07-11 09:59:37
【问题描述】:

所以,我有这个Class 实例列表。我想将其转换为由类声明的Constructors 列表。

我将这些类映射到它们声明的构造函数并使用collect 将其展平:

services.stream()
    .map(Class::getDeclaredConstructors)
    .collect(ArrayList::new,
        this::collectConstructors,
        List::addAll)

为了收集,我使用了一个方法,它需要访问类上下文,这就是它不是静态的原因。

private void collectConstructors(List<Constructor> l, Constructor<?>[] arr) {
    if (arr.length == 0) {
        return;
    }

    Class<?> clz = arr[0].getDeclaringClass();
    if (arr.length > 1) {
        throw new MoreThanOneConstructor(clz);
    }

    if (!Modifier.isPublic(arr[0].getModifiers())) {
        throw new NoVisibleConstructor(clz);
    }

    l.add(arr[0]);
    findDefinition(clz).setConstructor(arr[0]);
}

好处是,一切正常。不好的是,IntelliJ 和 SonarQube 都告诉我,没有使用 collectConstructors 方法。丑陋的,或者说很有趣的是,当我点击它并突出显示匹配的对应项时,IntelliJ 完全知道使用了该方法。

工具告诉我,没有使用该方法是怎么来的?缺少工具支持?我的烂代码?这是什么?

【问题讨论】:

  • 缺少工具支持
  • 当你下面的层添加新功能时,总会有一个bug尾巴;我确信这只是他们的一个小(并且很容易修复)遗漏。 IntelliJ 对错误报告非常敏感,因此您可以考虑向他们报告。
  • 我猜你正在使用 sonarLint 并且问题来自它?如果我是正确的:哪个版本?
  • @benzonico 我使用 maven 声纳插件和 sonarqube.com 作为目标。声纳版本是 6.2.1

标签: java intellij-idea java-8 sonarqube


【解决方案1】:

它已在 SonarQube 中被识别为已知的issue。它说他们已经用 4.0 版修复了这个问题。这是语义分析的问题。

你的代码没有问题,只是工具而已。

【讨论】:

    【解决方案2】:

    也许可以静态分析 serivces.isEmpty() 始终为真,因此 stream() 将为空,不会执行任何 collectConstructors 调用?

    【讨论】:

    • 它必须运行该代码,但即便如此,这种可能性也很小。很可能是工具。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-13
    相关资源
    最近更新 更多