Erro constantes

8 respostas
programaçãojava
J

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;
}

}

8 Respostas

L

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.

J

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

R

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;
}
}
J

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

L

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;
	}
}
P

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.

C

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.

P

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;
}
Criado 12 de janeiro de 2018
Ultima resposta 14 de jan. de 2018
Respostas 8
Participantes 6