Może to spowodować nieco mniejszy kod bajtowy, ponieważ metody statyczne nie uzyskają dostępu do this
. Nie sądzę, żeby miało to jakąkolwiek różnicę w szybkości (a gdyby tak się stało, prawdopodobnie byłby zbyt mały, aby zrobić ogólną różnicę).
Uczyniłbym je statycznymi, ponieważ generalnie robię to, jeśli to w ogóle możliwe. Ale to tylko ja.
EDYCJA: Ta odpowiedź wciąż jest lekceważona, być może z powodu bezpodstawnego twierdzenia o rozmiarze kodu bajtowego. Więc faktycznie przeprowadzę 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);
}
}
Kod bajtowy (pobrany za pomocą 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
}
Wywołanie metody statycznej wymaga dwóch bajtów (bajtów?): iconst_0
(Dla argumentu) i invokestatic
.
Wywołanie metody niestatycznej wymaga trzech: aload_1
(jak TestBytecodeSize
sądzę dla obiektu), iconst_0
(dla argumentu) i invokespecial
. (Zauważ, że gdyby nie były to metody prywatne, byłoby to invokevirtual
zamiast tego invokespecial
; patrz JLS §7.7 Metody wywoływania ).
Teraz, jak powiedziałem, nie oczekuję, że między tymi dwoma invokestatic
rzeczami będzie jakaś wielka różnica, poza faktem, że wymaga o jeden mniej bajtekodu. invokestatic
i invokespecial
oba powinny być nieco szybsze niż invokevirtual
, ponieważ oba używają wiązania statycznego zamiast dynamicznego, ale nie mam pojęcia, czy jedno z nich jest szybsze od drugiego. Nie mogę też znaleźć żadnych dobrych referencji. Najbliżej mogę znaleźć ten artykuł JavaWorld z 1997 roku , który w zasadzie stanowi powtórzenie tego , co właśnie powiedziałem:
Najszybsze instrukcje najprawdopodobniej będą, invokespecial
a invokestatic
ponieważ metody wywoływane przez te instrukcje są statycznie powiązane. Kiedy JVM rozpozna symboliczne odniesienie dla tych instrukcji i zastąpi je bezpośrednim odwołaniem, to bezpośrednie odniesienie prawdopodobnie będzie zawierało wskaźnik do rzeczywistych kodów bajtowych.
Ale wiele rzeczy zmieniło się od 1997 roku.
Podsumowując ... Chyba wciąż trzymam się tego, co powiedziałem wcześniej. Szybkość nie powinna być powodem do wybierania jednej z drugiej, ponieważ w najlepszym przypadku byłaby to mikrooptymalizacja.