2015-12-20 7 views
8

dieser Code Gegeben:IntelliJ sagt, sollte wohl nicht als Parameter übergeben werden x

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 eine Warnung für den Vergleich Linie zeigt oben und sagte:

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

Die Warnung kann mit einem Kommentar auf die Aussage unterdrückt werden:

//noinspection SuspiciousNameCombination 

Ok, aber was ist hier so verdächtig?

Auch, wenn ich ändere, um das im Vergleich Feld left oder right (nur um zu spielen und zu untersuchen), die Warnung Verschiebungen auf den zweiten Parameter, zum Beispiel:

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

Was ist hier noch so verdächtig? Warum beschwert es sich über den ersten Parameter für das Feld height und über den zweiten Parameter für die Felder left und right? Was ist die Logik hier?

+0

Ich bin nicht sicher, warum genau, obwohl Sie versuchen können, durch diese - http://breandan.net/2014/04/20/intellij-inspections/ Im Grunde ist es besorgt, dass Sie einen Fehler/Tippfehler machen in Ihrer arg Bestellung/Wahl. Einfach zu vermeiden o1.height - o2.height (schneller auch!) – pvg

+2

@pvg - Dieser Ansatz wird für große Werte überlaufen ... –

+1

@OliverCharlesworth sicher, aber nichts hält Sie davon ab, die Reichweite bei der Konstruktion zu erzwingen. Es ist nicht so, dass negative Höhe auch Sinn macht. – pvg

Antwort

7

Wenn Sie die Inspektion in den Einstellungen sehen, seine Beschreibung heißt es folgende:

Berichte Zuweisungen und Funktionsaufrufe in dem der Name der Variablen , an dem ein Wert zugewiesen wird oder die Funktionsparameter nicht scheint um den Namen des zugewiesenen Werts zu finden. Zum Beispiel:

var x = 0; 
var y = x; 

oder

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

Das Konfigurationsfenster ermöglicht die Namen angeben, die sollten zusammen nicht verwendet werden: Der Fehler wird gemeldet, wenn der Parametername oder Zielzuweisung Name Wörter enthält Eine Gruppe und der Name die zugewiesene oder übergebene Variable enthält Wörter aus einer anderen Gruppe.

Da die Unterschrift von Integer.compare ist public static int compare(int x, int y), wird IntelliJ verwirrt und denkt, dass Sie versuchen, etwas zu übergeben, die Höhe auf einen Parameter repräsentiert semantisch x, die wahrscheinlich einige horizontalen Versatz, da sein Name darstellen sollte.

Sie können die Gruppe dieser Namen aus den Inspektionseinstellungen entfernen, dies zu beheben (oder die Inspektion vollständig deaktivieren):

enter image description here

5

Sie die Logik hier sehen können: https://github.com/JetBrains/intellij-community/blob/210e0ed138627926e10094bb9c76026319cec178/java/java-analysis-impl/src/com/intellij/codeInspection/suspiciousNameCombination/SuspiciousNameCombinationInspectionBase.java

Die relevanten Brocken ist dies:

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

x gilt als kompatibel mit 01.234., left und right, aber nicht mit height (und umgekehrt).

Verwandte Themen