Uso do this

Olá, no código abaixo, eu apenas coloquei o this no atributo tamanho porque tem um parâmetro com o mesmo nome que ele, para que o compilador não se confunda. Mas estou na dúvida se coloco nos outros também.

public class Pilha {
    private int tamanho;
    private Object[] vetor;
    private int topo;
	
public Pilha(int tamanho) {
    this.tamanho = tamanho;
    vetor = new Object[this.tamanho];
    topo = -1;
}

Eu sempre vejo meus professores referenciando todos os atributos da classe, em todos os métodos, com o this, independente se houver ou não uma variável local com mesmo nome que possa fazer o compilador entender errado. Se não há esse tipo de variável, o compilador já não entende que esses atributos são referentes aos da classe sem o uso do this?

Eu quero entender principalmente como funciona o compilador na hora de ler esse código.
Se pra ele fica melhor usar o this mesmo sem nada que possa o confundir ou não.

Caso vocês tenham algum material bom sobre esse tipo de assunto, estou aceitando indicações :slight_smile:

É uma boa pergunta. Eu acho que não precisa, se os nomes das variáveis são diferentes. Costumo colocar o this em todas por pura estética mesmo.

Uma forma de ver a diferença (se é que tem) seria usar: javap -c SuaClasse.class (execute com e sem o this), para ver como o class eh montado.

2 curtidas

Eu tenho o hábito de usar o this para ficar explícito e facilitar a leitura do código, mas já vi muita gente que não utiliza!

Acredito eu que não tenha nenhuma diferença significativa.

Se nessa linguagem não há necessidade, não use, o código fica mais limpo.

O javap é sensacional para analisarmos qual código é mais eficiente.

Peguei o código da classe Pilha que o @kimi postou e fiz justamente isso:

Fonte utilizando o this:

public class Pilha {
	private int tamanho;
	private Object[] vetor;
	private int topo;

	public Pilha(int tamanho) {
		this.tamanho = tamanho;
		vetor = new Object[this.tamanho];
		topo = -1;
	}
}

Código descompilado:

public class Pilha {
  private int tamanho;

  private java.lang.Object[] vetor;

  private int topo;

  public Pilha(int);
	Code:
	   0: aload_0
	   1: invokespecial #13                 // Method java/lang/Object."<init>":()V
	   4: aload_0
	   5: iload_1
	   6: putfield      #16                 // Field tamanho:I
	   9: aload_0
	  10: aload_0
	  11: getfield      #16                 // Field tamanho:I
	  14: anewarray     #3                  // class java/lang/Object
	  17: putfield      #18                 // Field vetor:[Ljava/lang/Object;
	  20: aload_0
	  21: iconst_m1
	  22: putfield      #20                 // Field topo:I
	  25: return
	LineNumberTable:
	  line 8: 0
	  line 9: 4
	  line 10: 9
	  line 11: 20
	  line 12: 25
	LocalVariableTable:
	  Start  Length  Slot  Name   Signature
		  0      26     0  this   Lsample/Pilha;
		  0      26     1 tamanho   I
}

Fonte não utilizando o this:

public class Pilha {
	private int tamanho;
	private Object[] vetor;
	private int topo;

	public Pilha(int paramTamanho) {
		tamanho = paramTamanho;
		vetor = new Object[tamanho];
		topo = -1;
	}
}

Código descompilado:

public class Pilha {
  private int tamanho;

  private java.lang.Object[] vetor;

  private int topo;

  public Pilha(int);
	Code:
	   0: aload_0
	   1: invokespecial #13                 // Method java/lang/Object."<init>":()V
	   4: aload_0
	   5: iload_1
	   6: putfield      #16                 // Field tamanho:I
	   9: aload_0
	  10: aload_0
	  11: getfield      #16                 // Field tamanho:I
	  14: anewarray     #3                  // class java/lang/Object
	  17: putfield      #18                 // Field vetor:[Ljava/lang/Object;
	  20: aload_0
	  21: iconst_m1
	  22: putfield      #20                 // Field topo:I
	  25: return
	LineNumberTable:
	  line 8: 0
	  line 9: 4
	  line 10: 9
	  line 11: 20
	  line 12: 25
	LocalVariableTable:
	  Start  Length  Slot  Name   Signature
		  0      26     0  this   Lsample/Pilha;
		  0      26     1 paramTamanho   I
}

Observa-se que, neste exemplo, não houve diferença nas instruções geradas no bytecode.

2 curtidas