Un'ultima cosa da aggiungere a ciò che le persone hanno detto qui.
L'utilizzo di un metodo static
presenta un sovraccarico leggermente inferiore dovuto al fatto che è stato garantito il binding in fase di compilazione. Le chiamate al metodo statico creeranno l'istruzione bytecode invokestatic
. ]
In uno scenario tipico, i metodi di istanza sono associati al runtime e creeranno l'istruzione bytecode invokevirtual
che ha un sovraccarico superiore a invokestatic
.
Tuttavia, questo diventa rilevante solo nel caso di milioni di iterazioni probabili, e vorrei mettere in guardia contro questo aspetto del design della vostra classe. Fai ciò che ha senso dal punto di vista del design. In base alla tua descrizione, i metodi static
sono probabilmente la scelta giusta. In effetti, questa è una pratica relativamente normale per creare una classe di utilità:
public class MyUtilities {
private MyUtilities() { } // don't let anyone construct it.
public static String foo(String s) { ... }
}
La storia è un po 'più complicata dal momento che 'invokevirtual' non è un'istruzione di macchina reale. Nel peggiore dei casi verrà implementato come sito di chiamata monomorfico, ma se la classe è definitiva (o effettivamente definitiva in virtù del costruttore privato), sarà una chiamata cablata. Anche senza questo, il runtime potrebbe notare che non ci sono sottoclassi e la chiamata è comunque cablata. –
Sì, capisco che non garantisce che non è cablato, ma stavo cercando di mantenere la spiegazione semplice, in quanto la maggior parte delle persone non capisce gli interni del jvm. – Matt
Devo dire che la tua formulazione è fuorviante. Non esiste uno "scenario tipico" qui: invocazione del metodo di istanza ** sempre ** compila a 'invokevirtual'; allo stesso modo con metodo statico e 'invokestatic'. –