Puede resultar en un código de bytes ligeramente más pequeño, ya que los métodos estáticos no tendrán acceso this
. No creo que haga ninguna diferencia en la velocidad (y si lo hiciera, probablemente sería demasiado pequeño para hacer una diferencia en general).
Los haría estáticos, ya que generalmente lo hago si es posible. Pero solo soy yo.
EDITAR: Esta respuesta sigue siendo rechazada, posiblemente debido a la afirmación no confirmada sobre el tamaño del código de bytes. Así que realmente haré una prueba.
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 con 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
}
Invocar el método estático requiere dos bytecodes (byteops?): iconst_0
(Para el argumento) y invokestatic
.
Invocar el método no estático requiere tres: aload_1
(para el TestBytecodeSize
objeto, supongo), iconst_0
(para el argumento) y invokespecial
. (Tenga en cuenta que si estos no hubieran sido métodos privados, lo habría sido en invokevirtual
lugar de invokespecial
; consulte JLS §7.7 Métodos de invocación ).
Ahora, como dije, no espero que haya una gran diferencia en el rendimiento entre estos dos, aparte del hecho de que invokestatic
requiere un código de bytes menos. invokestatic
y invokespecial
ambos deberían ser un poco más rápidos que invokevirtual
, ya que ambos usan enlace estático en lugar de dinámico, pero no tengo idea si alguno es más rápido que el otro. Tampoco puedo encontrar buenas referencias. Lo más cercano que puedo encontrar es este artículo de JavaWorld de 1997 , que básicamente repite lo que acabo de decir:
Las instrucciones más rápidos serán muy probablemente invokespecial
y invokestatic
, porque los métodos invocados por estas instrucciones están ligados de forma estática. Cuando la JVM resuelve la referencia simbólica para estas instrucciones y la reemplaza por una referencia directa, esa referencia directa probablemente incluirá un puntero a los códigos de bytes reales.
Pero muchas cosas han cambiado desde 1997.
En conclusión ... Supongo que todavía me quedo con lo que dije antes. La velocidad no debería ser la razón para elegir uno sobre el otro, ya que sería una micro optimización en el mejor de los casos.