Dal JDK 7 ho felicemente con il metodo ha introdotto a respingere null
valori che sono passati ad un metodo che non li possono accettare:Oggetti.requireNonNull è meno efficiente del vecchio modo?
private void someMethod(SomeType pointer, SomeType anotherPointer) {
Objects.requireNonNull(pointer, "pointer cannot be null!");
Objects.requireNonNull(anotherPointer, "anotherPointer cannot be null!");
// Rest of method
}
Penso che questo metodo rende il codice molto ordinata che è facile da leggere, e sto cercando di incoraggiare i colleghi a usarlo. Ma uno (particolarmente competenti) collega è resistente, e dice che il vecchio modo è più efficiente:
private void someMethod(SomeType pointer, SomeType anotherPointer) {
if (pointer == null) {
throw new NullPointerException("pointer cannot be null!");
}
if (anotherPointer == null) {
throw new NullPointerException("anotherPointer cannot be null!");
}
// Rest of method
}
Dice che chiama requireNonNull
prevede il posizionamento altro metodo nello stack di chiamate JVM e si tradurrà in prestazioni di peggio di un semplice == null
controllo.
Quindi la mia domanda: c'è qualche prova di una sanzione di prestazioni sostenute utilizzando i metodi Objects.requireNonNull
?
No. Non lo è. Il tuo collega "informato" evidentemente non è così informato come pensa (s). Qualunque impatto sulle prestazioni che potrebbe avere è trascurabile e molto probabilmente verrà sottolineato dalla JIT se rileva che il metodo è fortemente utilizzato. –
Il JIT in linea felicemente le chiamate di metodo. Dovresti ricordare la prima regola di ottimizzazione per il tuo vecchio padawan: * non *. Dovrebbe essere lui a dimostrare che questa chiamata al metodo è la causa di un problema significativo prima di obbligare tutti a produrre codice meno leggibile. –
[OpenJDK bug 8073479] (https://bugs.openjdk.java.net/browse/JDK-8073479) ha convertito i tradizionali controlli nulli 'foo.getClass()' di JDK per usare 'Objects.requireNonNull', invece, non richiedendo prestazioni degrado e talvolta un miglioramento. –