Dúvida atributos final e construtores sobrecarregados

3 respostas
rmala_ti

Salve galera!

Gostaria de saber o motivo que o código abaixo dá erro de compilação.

public class SobrecargaConstrutor {
  
  final Integer atributoA;
  Integer atributoB;
  
  
  public SobrecargaConstrutor(Integer atributoA, Integer atributoB){ //Construtor #1
	  this.atributoA = atributoA;
	  this.atributoB = atributoB;
  }
  
  public SobrecargaConstrutor(Integer atributoB){ //Construtor #2
	 this.atributoB = atributoB;
  }
}

O construtor sobrecarregado #2 apresenta erro de Compilação com a seguinte mensagem: “The blank final field atributoA may not have been initialized”

Gostaria de saber se não posso mesmo sobrecarregar um construtor se houver algum atributo final e que não seja inicializada neste construtor.

E qual seria a solução?

3 Respostas

S

O problema ai não é a sobrecarga de construtores.

As variáves de instância final devem ter seu valor atribuído antes que o construtor termine sua execução.
Então mesmo que vc tivesse apenas um construtor, se não estiver inicializando as variáveis de instância final dentro do construtor ou na declaração da variável o código não compila.
Outra regra é que variáveis final só podem ser inicializadas uma vez, então se optar por inicializar na declaração não poderá inicializar novamente no construtor.

As solução que eu proponho são essas:

* inicializar as variáveis de instância final dentro do construtor
final Integer atributoA;  
Integer atributoB;	     
		        
	  public SobrecargaConstrutor(Integer atributoA, Integer atributoB){ //Construtor #1  
		  this.atributoA = atributoA;  
   	          this.atributoB = atributoB;  
         }  
	       
	  public SobrecargaConstrutor(Integer atributoB){ //Construtor #2
	          this.atributoA = 0;
		  this.atributoB = atributoB;  
         }

ou

*inicializar as variáveis de instância final declaração da variável
final Integer atributoA =0;  
Integer atributoB;	     
		        
	 public SobrecargaConstrutor(Integer atributoA, Integer atributoB){ //Construtor #1  
		 this.atributoB = atributoB;  
	 }  
		       
	 public SobrecargaConstrutor(Integer atributoB){ //Construtor #2
	     this.atributoB = atributoB;  
	 }
ataufo

O que o compilador está dizendo para você é: existe a possibilidade de atributo atributoA não ser inicializado. Ou seja erro !

Felagund
final Integer atributoA;  
Integer atributoB;	     
		        
	 public SobrecargaConstrutor(Integer atributoA, Integer atributoB){ //Construtor #1  
                 this.atributoA = atributoA;
		 this.atributoB = atributoB;  
	 }  
		       
	 public SobrecargaConstrutor(Integer atributoB){ //Construtor #2
	     this(0, atributoB); //Chama o contrutos #1
	 }

A pergunta já foi respondida, so estou mostrando como usar o this, nos construtroes e definir valores padrão usando o mesmo construtor.

Criado 1 de agosto de 2009
Ultima resposta 3 de ago. de 2009
Respostas 3
Participantes 4