Dies kann zu einem etwas kleineren Bytecode führen, da die statischen Methoden keinen Zugriff erhalten this
. Ich denke nicht, dass es einen Unterschied in der Geschwindigkeit macht (und wenn es so wäre, wäre es wahrscheinlich zu klein, um insgesamt einen Unterschied zu machen).
Ich würde sie statisch machen, da ich dies im Allgemeinen tue, wenn es überhaupt möglich ist. Aber das bin nur ich.
BEARBEITEN: Diese Antwort wird immer wieder abgelehnt, möglicherweise aufgrund der unbegründeten Behauptung über die Bytecode-Größe. Also werde ich tatsächlich einen Test durchführen.
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 (abgerufen mit 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
}
Das Aufrufen der statischen Methode erfordert zwei Bytecodes (Byteops?): iconst_0
(Für das Argument) und invokestatic
.
Das Aufrufen der nicht statischen Methode erfordert drei: aload_1
(für das TestBytecodeSize
Objekt, nehme ich an), iconst_0
(für das Argument) und invokespecial
. (Beachten Sie, dass, wenn dies keine privaten Methoden gewesen wären, dies invokevirtual
stattdessen gewesen wäre invokespecial
; siehe JLS §7.7 Aufrufen von Methoden .)
Nun, wie gesagt, ich erwarte keinen großen Leistungsunterschied zwischen diesen beiden, abgesehen von der Tatsache, invokestatic
dass ein Bytecode weniger erforderlich ist. invokestatic
und invokespecial
sollten beide etwas schneller sein als invokevirtual
, da beide statische Bindung anstelle von dynamischer verwenden, aber ich habe keine Ahnung, ob einer schneller als der andere ist. Ich kann auch keine guten Referenzen finden. Der nächstgelegene, den ich finden kann, ist dieser JavaWorld-Artikel von 1997 , in dem im Grunde das wiederholt wird, was ich gerade gesagt habe:
Die schnellsten Anweisungen sind höchstwahrscheinlich invokespecial
und invokestatic
, da die von diesen Anweisungen aufgerufenen Methoden statisch gebunden sind. Wenn die JVM die symbolische Referenz für diese Anweisungen auflöst und durch eine direkte Referenz ersetzt, enthält diese direkte Referenz wahrscheinlich einen Zeiger auf die tatsächlichen Bytecodes.
Aber seit 1997 haben sich viele Dinge geändert.
Also abschließend ... Ich denke, ich bleibe immer noch bei dem, was ich vorher gesagt habe. Geschwindigkeit sollte nicht der Grund sein, sich für eine andere zu entscheiden, da dies bestenfalls eine Mikrooptimierung wäre.