...e, como eu sou um cara bonzinho, aqui vai o código que prova que a sua afirmação (chute, como queira) de que um cast é mais lento que um new, está errada.
Primeiro, vamos definir alguns objetos bobinhos só pra gente ter o que fazer:
interface X { }
interface Y { }
interface Z { }
class A implements X {}
class B extends A implements Y { }
class C extends B implements Z { }
E, depois, vamos instanciar e fazer casts deles até a VM cansar (note que estou rodando os testes 3 vezes, para dar tempo ao hotspot):
public class CastVersusNew {
public static void main(String[] args) {
for (int i = 1; i <= 3; i++) {
System.out.println("Run " + i);
testNew();
testCast();
}
}
private static void testCast() {
A a = new C();
long start = System.currentTimeMillis();
for (int i = 0; i < [telefone removido]; i++) {
B b = (B) a;
}
System.out.println("Cast: " + (System.currentTimeMillis() - start));
}
private static void testNew() {
long start = System.currentTimeMillis();
for (int i = 0; i < [telefone removido]; i++) {
C c = new C();
}
System.out.println("New: " + (System.currentTimeMillis() - start));
}
}
Não testei no desktop, mas no notebook (P4, 512mb, JVM Sun 1.4.2-b28 com HotSpot Client), os resultados sao:
Run 1
New: 14616
Cast: 4648
Run 2
New: 16759
Cast: 5049
Run 3
New: 18652
Cast: 5299
Editado: usando -server, o resultado eh mais aparente ainda:
Run 1
New: 15557
Cast: 10
Run 2
New: 15306
Cast: 0
Run 3
New: 15207
Cast: 0