Atributos final em métodos

3 respostas
Rafael_Afonso

Senhoras e Senhores:

Suponham os dois métodos abaixo

public void metodo1(int x) {
   // ...
}

public void metodo2(final int x) {
   // ...
}

nos dois casos a variável x não será alterada.
:?: Há de fato alguma melhora de desempenho no caso do método2? Há alguma literatura disponível na Internet a respeito disso?

Grato,

3 Respostas

Rafael_Steil

http://www-106.ibm.com/developerworks/java/library/j-jtp04223.html
http://www-106.ibm.com/developerworks/java/library/j-jtp1029.html

Rafael

wbsouza

Não acredito que haja melhora ao se colocar final no parâmetro por que a característica do java é passar tipo de dados primitivos por valor. Ou seja, o java sempre fará uma cópia dos parametros e adicionará na pilha de chamadas (call stack). Nesse sentido, acredito que é desnecessário. Lembre-se que estamos falando de tipo de dados primitivo, no caso de um parâmetro do tipo objeto é outra história, pois aí é sempre passado como referência.

[]s, Welington B. Souza

Rafael_Afonso

Senhores:

Seguindo uma sugestão criei a seguinte classe:

public class TestaFinal{

    private void semFinal(int x) {
        System.out.println(x);
        int a = x;
    }

    private void comFinal(final int x) {
        System.out.println(x);
        int a = x;
    }

}

Compilei e depois digitei o seguinte comando

javap -private -c TestaFinal

o “-c” é para “desassemblar” a classe. O “-private” é para incluir os métodos privados (senão só mostra o construtor). O que obtive foi o seguinte:

Compiled from "TestaFinal.java"
public class TestaFinal extends java.lang.Object{
private final void semFinal(int);
  Code:
   0:	getstatic	#12; //Field java/lang/System.out:Ljava/io/PrintStream;
   3:	iload_1
   4:	invokevirtual	#17; //Method java/io/PrintStream.println:(I)V
   7:	iload_1
   8:	istore_2
   9:	return

private final void comFinal(int);
  Code:
   0:	getstatic	#12; //Field java/lang/System.out:Ljava/io/PrintStream;
   3:	iload_1
   4:	invokevirtual	#17; //Method java/io/PrintStream.println:(I)V
   7:	iload_1
   8:	istore_2
   9:	return

public TestaFinal();
  Code:
   0:	aload_0
   1:	invokespecial	#24; //Method java/lang/Object."<init>":()V
   4:	return

}

Ou seja, não há diferença alguma em usar final ou não. Aqui estou falando em termos de desempenho. Há a vantagem de proibir o parâmetro de ser alterado acidentalmente. Vide este texto: http://renaud.waldura.com/doc/java/final-keyword.shtml.

Grato,

Criado 28 de junho de 2003
Ultima resposta 29 de jun. de 2003
Respostas 3
Participantes 3