2015-12-20 14 views
8

Dato questo codice:IntelliJ dice, probabilmente non dovrebbe essere passato come parametro 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 mostra un messaggio di avviso per la linea di confronto di cui sopra, dicendo:

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

L'avvertimento può essere soppresso con un commento sulla dichiarazione:

//noinspection SuspiciousNameCombination 

Ok, ma cosa c'è di così sospetto qui?

Inoltre, se cambio il campo rispetto al left o right (solo per il gusto di giocare e indagando), i turni di avvertimento per il secondo parametro, ad esempio:

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

Di nuovo, cosa c'è di così sospetto qui? Perché si lamenta del primo parametro per il campo height e del secondo parametro per i campi left e right? Qual è la logica qui?

+0

Non sono sicuro del perché esattamente anche se puoi provare a guadare questo - http://breandan.net/2014/04/20/intellij-inspections/ Fondamentalmente, è preoccupato che tu stia commettendo un errore/errore di battitura nel tuo ordine/scelta arg. Facilmente evitato semplicemente restituendo o1.height - o2.height (anche più veloce!) – pvg

+2

@pvg - Questo approccio sarà troppo pieno per grandi valori ... –

+1

@OliverCharlesworth certo, ma non c'è nulla che ti impedisca di far rispettare l'intervallo di costruzione. Neanche l'altezza negativa ha senso. – pvg

risposta

7

Quando si cerca l'ispezione nelle impostazioni, la sua descrizione stati seguenti:

Rapporti assegnazioni e la funzione chiamate in cui il nome della variabile a cui viene assegnato un valore o il parametro funzione non sembra per abbinare il nome del valore assegnato ad esso. Per esempio:

var x = 0; 
var y = x; 

o

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

Il riquadro di configurazione permette di specificare i nomi che non dovrebbe essere usati insieme: l'errore viene segnalato se il nome del parametro o assegnazione del nome di destinazione contiene parole da un gruppo e il nome di la variabile assegnata o passata contiene le parole di un gruppo diverso.

Poiché la firma del Integer.compare è public static int compare(int x, int y), IntelliJ si confonde e pensa che si sta tentando di trasmettere qualcosa che rappresenta semanticamente altezza per un parametro x che dovrebbe probabilmente rappresentano alcuni di offset orizzontali, dato il suo nome.

È possibile rimuovere il gruppo di questi nomi dalle impostazioni di controllo per risolvere questo problema (o disattivare l'ispezione del tutto):

enter image description here

5

si può vedere la logica qui: https://github.com/JetBrains/intellij-community/blob/210e0ed138627926e10094bb9c76026319cec178/java/java-analysis-impl/src/com/intellij/codeInspection/suspiciousNameCombination/SuspiciousNameCombinationInspectionBase.java

Il rilevanti chunk è questo:

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

x è ritenuto compatibile con 01.234., left e right, ma non con height (e viceversa).

Problemi correlati