Erro constantes

Porque esta com esse erro na clases??

public class Imposto_Model {

private double inss_retido, inss_patronal;
final int ALIQUOTA_1;
final int ALIQUOTA_2;
final int ALIQUOTA_3;

public Imposto_Model(int ALIQUOTA_1, int ALIQUOTA_2, int ALIQUOTA_3) {
    this.ALIQUOTA_1 = ALIQUOTA_1;
    this.ALIQUOTA_2 = ALIQUOTA_2;
    this.ALIQUOTA_3 = ALIQUOTA_3;
}

public Imposto_Model() {
 // esse construtor esta mstrando um erro na IDE
}

public double getInss_retido() {
    return inss_retido;
}

public void setInss_retido(double inss_retido) {
    this.inss_retido = inss_retido;
}

public double getInss_patronal() {
    return inss_patronal;
}

public void setInss_patronal(double inss_patronal) {
    this.inss_patronal = inss_patronal;
}

}

Aquele construtor tá dando error porque você declarou as aliquotas como final e elas precisam estar inicializadas (o que está sendo feito no contrutor acima).

Faz o seguinte, declara como private. Aí tu vai ter dois contrutores, um que inicializa sem valores e outro que inicializa com valores.

2 curtidas

O meu problema é que preciso, em tempo de execução, atribuir um valor a estas constantes… e não estou conseguindo.

Exatamente por isso que você deve declarar como private e não como final.

Depois é só atribuir os valores pelos métodos set.

public class Imposto_Model {

private double inss_retido, inss_patronal;
private int ALIQUOTA_1;
private int ALIQUOTA_2;
private int ALIQUOTA_3;

public Imposto_Model() {
 // esse construtor esta mstrando um erro na IDE
}

public Imposto_Model(int ALIQUOTA_1, int ALIQUOTA_2, int ALIQUOTA_3) {
    this.ALIQUOTA_1 = ALIQUOTA_1;
    this.ALIQUOTA_2 = ALIQUOTA_2;
    this.ALIQUOTA_3 = ALIQUOTA_3;
} //Você não precisa deste construtor para passar valores em tempo de execução, você deve usar os get e set para pegar e setar valores.

public double getInss_retido() {
    return inss_retido;
}

public void setInss_retido(double inss_retido) {
    this.inss_retido = inss_retido;
}

public double getInss_patronal() {
    return inss_patronal;
}

public void setInss_patronal(double inss_patronal) {
    this.inss_patronal = inss_patronal;
}
}

Por ser constantes, nao deveria manter com o modificar FINAL??

Sim, quando você já as tem de início. Assim o modificador final requer que você as declare na classe ou no construtor. Desse jeito que você quer é impossível com essa estrutura, meu conselho seria criar uma classe Aliquota que essa sim possui três atributos final e vincular ela à sua classe de imposto. Também há o problema de essa classe ser alterada, mas você pode gerar uma exception caso tente atribuir uma Aliquota há um objeto que já o possui.

class ImpostoModel {

	private double inssRetido, inssPatronal;
	private Aliquotas aliquotas;

	public ImpostoModel(Aliquotas aliquotas) {
	    this.aliquotas = aliquotas;
	}

	public ImpostoModel() {
		aliquotas = null;
	}
	
	public void setAliquota(Aliquotas aliquotas) {
		if(this.aliquotas != null) {
			throw new Exception("Aliquotas not NULL");
		} else {
			this.aliquotas = aliquotas;
		}
	}

	public double getInssRetido() {
	    return inssRetido;
	}

	public void setInssRetido(double inssRetido) {
	    this.inssRetido = inssRetido;
	}

	public double getInssPatronal() {
	    return inssPatronal;
	}

	public void setInssPatronal(double inssPatronal) {
	    this.inssPatronal = inssPatronal;
	}
}
1 curtida

As variaveis podem perfeitamente ser final. O problema é que elas precisam de um valor e, se o objecto for criado no teu constructor sem parâmetros as variáveis não vão ter valor.
Deves eliminar esse construtor ou atribuir um valor às variáveis dentro dele.

Boa noite amigo. Vou tentar explicar o que sei.

Uma Constante não pode iniciar sem valor. Deve ser declarado na declaração ou no construtor (O valor não pode ser passado por parâmetro).

Veja o que eu consegui:

public class ImpostoModel {

private double inss_retido, inss_patronal;
final int ALIQUOTA_1 = 2;
final int ALIQUOTA_2 = 3;  
final int ALIQUOTA_3; //declarado no construtor

// construtor padrao
public ImpostoModel() {
    this.ALIQUOTA_3 = 3; // exemplo de declaracao
}

“final significa que a variável é uma constante… não poderá receber outro valor e deverá ser iniciada com algum valor.” erico_kl

Veja mais no link: Declarar uma constante

Se você precisar passar o valor por parâmetro e não modificá-lo, acredito que dessa forma você consiga.

public class ImpostoModel {

private double inss_retido, inss_patronal;
private int aliquota1;
private int aliquota2;  
private int aliquota3; 

// construtor padrao

public ImpostoModel(int aliquota1, int aliquota2, int aliquota3) {
    this.aliquota1 = aliquota1;
    this.aliquota2 = aliquota2;
    this.aliquota3 = aliquota3;
}

As variáveis serão privadas e não terão Setters, logo, não serão modificadas.
_
Um abraço.

E essas variáveis podem perfeitamente ser final desde que no construtor padrão, se declarado, tenham valor atribuido

private final int aliquota1;
private final int aliquota2;  
private final int aliquota3; 

public ImpostoModel() {
    this.aliquota1 = 0;  //um valor default
    this.aliquota2 = 0;  //um valor default
    this.aliquota3 = 0;  //um valor default
}

public ImpostoModel(int aliquota1, int aliquota2, int aliquota3) {
    this.aliquota1 = aliquota1;
    this.aliquota2 = aliquota2;
    this.aliquota3 = aliquota3;
}