Cela pourrait entraîner un bytecode légèrement plus petit, car les méthodes statiques n'auront pas accès à this
. Je ne pense pas que cela fasse une différence de vitesse (et si c'était le cas, ce serait probablement trop petit pour faire une différence dans l'ensemble).
Je les rendrais statiques, car je le fais généralement si possible. Mais c'est juste moi.
EDIT: Cette réponse ne cesse de faire l'objet d'un vote négatif, peut-être en raison de l'assertion non étayée de la taille du bytecode. Je vais donc réellement effectuer un test.
class TestBytecodeSize {
private void doSomething(int arg) { }
private static void doSomethingStatic(int arg) { }
public static void main(String[] args) {
// do it twice both ways
doSomethingStatic(0);
doSomethingStatic(0);
TestBytecodeSize t = new TestBytecodeSize();
t.doSomething(0);
t.doSomething(0);
}
}
Bytecode (récupéré avec javap -c -private TestBytecodeSize
):
Compiled from "TestBytecodeSize.java"
class TestBytecodeSize extends java.lang.Object{
TestBytecodeSize();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
private void doSomething(int);
Code:
0: return
private static void doSomethingStatic(int);
Code:
0: return
public static void main(java.lang.String[]);
Code:
0: iconst_0
1: invokestatic #2; //Method doSomethingStatic:(I)V
4: iconst_0
5: invokestatic #2; //Method doSomethingStatic:(I)V
8: new #3; //class TestBytecodeSize
11: dup
12: invokespecial #4; //Method "<init>":()V
15: astore_1
16: aload_1
17: iconst_0
18: invokespecial #5; //Method doSomething:(I)V
21: aload_1
22: iconst_0
23: invokespecial #5; //Method doSomething:(I)V
26: return
}
L'appel de la méthode statique prend deux octets (octets?): iconst_0
(Pour l'argument) et invokestatic
.
L'invocation de la méthode non statique en prend trois: aload_1
(pour l' TestBytecodeSize
objet, je suppose), iconst_0
(pour l'argument), et invokespecial
. (Notez que si ceux - ci n'avaient pas des méthodes privées, il aurait été au invokevirtual
lieu de invokespecial
, voir JLS Méthodes §7.7 Invocation .)
Maintenant, comme je l'ai dit, je ne m'attends pas à ce qu'il y ait une grande différence de performances entre ces deux, à part le fait que cela invokestatic
nécessite un bytecode de moins. invokestatic
et invokespecial
devraient tous deux être légèrement plus rapides que invokevirtual
, car ils utilisent tous deux une liaison statique au lieu de dynamique, mais je n'ai aucune idée si l'un est plus rapide que l'autre. Je ne trouve pas non plus de bonnes références. Le plus proche que je peux trouver est cet article de JavaWorld de 1997 , qui reprend essentiellement ce que je viens de dire:
Les instructions les plus rapides seront probablement invokespecial
et invokestatic
, car les méthodes invoquées par ces instructions sont liées statiquement. Lorsque la JVM résout la référence symbolique de ces instructions et la remplace par une référence directe, cette référence directe inclura probablement un pointeur vers les bytecodes réels.
Mais beaucoup de choses ont changé depuis 1997.
Donc en conclusion ... Je suppose que je reste fidèle à ce que j'ai dit auparavant. La vitesse ne devrait pas être la raison de choisir l'un plutôt que l'autre, car ce serait au mieux une micro-optimisation.