2015-12-20 10 views
8

Biorąc pod uwagę ten kod:IntelliJ mówi, nie powinna być przekazana jako parametr 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 pokazuje ostrzeżenie dla linii porównania wyżej, mówiąc:

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

ostrzeżenie może być wyłączony z komentarzem do oświadczenia:

//noinspection SuspiciousNameCombination 

OK, ale co tu jest tak podejrzane?

Również, jeśli mogę zmienić pola w stosunku do left lub right (tylko dla dobra gra i badania), przesunięcia ostrzegawcze do drugiego parametru, na przykład:

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

Znowu, co tu jest tak podejrzane? Dlaczego narzeka na pierwszy parametr dla pola height i drugi parametr dla pól left i right? Jaka jest tutaj logika?

+0

Nie jestem pewien, dlaczego dokładnie, choć możesz spróbować przebrnąć przez to - http://breandan.net/2014/04/20/intellij-inspections/ Zasadniczo martwi Cię popełnianie błędów/literówka w swoim zamówieniu/wyborze. Łatwo uniknąć poprzez powrót o1.height - o2.height (szybciej też!) – pvg

+2

@pvg - To podejście będzie przepełnione dla dużych wartości ... –

+1

@OliverCharlesworth z pewnością, ale nic nie powstrzyma cię przed egzekwowaniem zasięgu przy budowie. To nie jest tak, że ujemna wysokość ma sens. – pvg

Odpowiedz

7

Kiedy patrzysz się na inspekcję w ustawieniach, opis jego stany następujące:

Raporty zadania i wywołania funkcji, gdzie nazwa zmiennej do którego przypisana jest wartość lub parametr funkcji nie wydaje aby dopasować nazwę przypisanej do niego wartości. Na przykład:

var x = 0; 
var y = x; 

lub

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

Okienko konfiguracja pozwala określić nazwy, które nie powinny być używane razem: błąd jest zgłaszane, jeśli nazwa parametru lub przypisanie nazwa docelowa zawiera słowa z jedna grupa i nazwa przypisana lub przekazana zmienna zawiera słowa z innej grupy.

Ponieważ podpis Integer.compare jest public static int compare(int x, int y), IntelliJ pogubi i myśli, które próbują przekazać coś, co semantycznie reprezentuje wysokość do parametru x że prawdopodobnie powinien reprezentować pewną poziomego przesunięcia, zważywszy na jego nazwisko.

można usunąć grupy tych nazw w ustawieniach kontroli to naprawić (lub całkowicie wyłączyć inspekcję):

enter image description here

5

Można zobaczyć logikę tutaj: https://github.com/JetBrains/intellij-community/blob/210e0ed138627926e10094bb9c76026319cec178/java/java-analysis-impl/src/com/intellij/codeInspection/suspiciousNameCombination/SuspiciousNameCombinationInspectionBase.java

Stosowna porcja jest następująca:

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

x jest uznany za zgodny z width, left i right, ale nie z height (i odwrotnie).

Powiązane problemy