Isso pode resultar em bytecode um pouco menor, já que os métodos estáticos não terão acesso this
. Não acho que isso faça diferença na velocidade (e, se o fizesse, provavelmente seria pequeno demais para fazer a diferença no geral).
Eu os tornaria estáticos, pois geralmente faço isso, se possível. Mas sou só eu.
EDIT: Esta resposta está ficando com voto negativo, possivelmente por causa da afirmação infundada sobre o tamanho do bytecode. Então, eu realmente vou fazer um teste.
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 (recuperado com 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
}
A invocação do método estático requer dois bytecodes (byteops?): iconst_0
(Para o argumento) e invokestatic
.
A invocação do método não estático requer três: aload_1
(para o TestBytecodeSize
objeto, suponho), iconst_0
(para o argumento) e invokespecial
. (Observe que, se esses não fossem métodos particulares, teria sido em invokevirtual
vez de invokespecial
; consulte JLS §7.7 Invocando métodos .)
Agora, como eu disse, não espero que haja grande diferença no desempenho entre esses dois, além do fato de invokestatic
exigir menos um bytecode. invokestatic
e invokespecial
ambos devem ser um pouco mais rápidos que invokevirtual
, uma vez que ambos usam ligação estática em vez de dinâmica, mas não faço ideia se um deles é mais rápido que o outro. Também não consigo encontrar boas referências. O mais próximo que posso encontrar é este artigo do JavaWorld de 1997 , que basicamente reafirma o que eu acabei de dizer:
As instruções mais rápidas provavelmente serão invokespecial
e invokestatic
, porque os métodos invocados por essas instruções são estaticamente vinculados. Quando a JVM resolve a referência simbólica para essas instruções e a substitui por uma referência direta, essa referência direta provavelmente incluirá um ponteiro para os bytecodes reais.
Mas muitas coisas mudaram desde 1997.
Então, em conclusão ... acho que ainda estou mantendo o que disse antes. A velocidade não deve ser o motivo para escolher um sobre o outro, pois seria na melhor das hipóteses uma micro-otimização.