IntelliJ说,应该不应该作为参数x传递

时间:2015-12-20 09:27:18

标签: java intellij-idea

鉴于此代码:

private static class Building {
    private final int left;
    private final int right;
    private final int height;

    private Building(int left, int right, int height) {
        this.left = left;
        this.right = right;
        this.height = height;
    }
}

private PriorityQueue<Building> createMaxHeapByHeight() {
    return new PriorityQueue<>(new Comparator<Building>() {
        @Override
        public int compare(Building o1, Building o2) {
            return -Integer.compare(o1.height, o2.height);
        }
    });
}

IntelliJ显示上面比较行的警告,说:

return -Integer.compare(o1.height, o2.height);
//                      ^^^^^^^^^
//                      'height' should probably not be passed as parameter 'x'

可以通过对语句发表评论来抑制警告:

//noinspection SuspiciousNameCombination

好的,但是这里有什么可疑的?

此外,如果我将比较字段更改为leftright(仅为了播放和调查),警告会转移到第二个参数,例如:

return -Integer.compare(o1.right, o2.right);
//                                ^^^^^^^^
//                                'right' should probably not be passed as parameter 'y'

再次,这里有什么可疑的?为什么它会抱怨字段height的第一个参数,以及字段leftright的第二个参数?这里的逻辑是什么?

2 个答案:

答案 0 :(得分:13)

在设置中查找检查时,其说明如下:

  

报告赋值和函数调用,其中包含变量的名称   分配了值或函数参数似乎没有   匹配分配给它的值的名称。例如:

var x = 0;
var y = x;
     

var x = 0, y = 0;
var rc = new Rectangle(y, x, 20, 20);
     

配置窗格允许指定不应该的名称   一起使用:如果参数名称或,则报告错误   赋值目标名称包含一个组中的单词和名称   已分配或已传递的变量包含来自其他组的单词。

因为Integer.compare的签名是public static int compare(int x, int y),所以IntelliJ会感到困惑并且认为你试图将语义上代表高度的东西传递给参数x,该参数可能代表一些水平偏移,名字。

您可以从检查设置中删除这些名称组以解决此问题(或完全禁用检查):

enter image description here

答案 1 :(得分:6)

您可以在此处查看逻辑:https://github.com/JetBrains/intellij-community/blob/210e0ed138627926e10094bb9c76026319cec178/java/java-analysis-impl/src/com/intellij/codeInspection/suspiciousNameCombination/SuspiciousNameCombinationInspectionBase.java

相关的块是这样的:

public SuspiciousNameCombinationInspection() {
    addNameGroup("x,width,left,right");
    addNameGroup("y,height,top,bottom");
}

x被视为与widthleftright兼容,但不与height兼容(反之亦然)。