Alternativa para problema com Calculo de ICMS

3 respostas
R

Boa noite pessoal, eu de novo, como estou estudando bastante acabam surgindo muitas dúvidas. Resolvi reproduzir um sistema de uma planilha em Excel que eu criei para a empresa em que trabalho. E cheguei no seguinte ponto:
O sistema é de uma Trading de grãos do grupo de empresas, basicamente este sistema faz a analise de margem de compra e vendas de grãos (Milho, Soja e Feijão). Para isto um dos passos mais importantes é o calculo de imposto, o qual eu tenho completo domínio. Ao tentar levar isso pro Java, minha ideia foi de criar uma classe ICMS mãe, com 3 filhas IcmsMilho, IcmsSoja, IcmsFeijão. Porém eu preciso decidir no código qual das 3 classes usar na variável icms porque o cálculo de impostos para cada um deles é diferente. Aí que pensei bom, posso tratar isso com um if … Coloco um input para escolher o produto e dependendo de qual produto ele escolher eu instancio a classe correta. O grande problema é que não compila, porque da forma que está o java fica acusando que a variável não está iniciada e a classe ICMS é abstrata. Alguém me ajuda por favor ?

public class Main {
    	public static void main(String[] args) {
    		String produto = "";
    		Icms icms;
    		ArrayList<String> index = new ArrayList<String>();
    		index.add("1");
    		index.add("2");
    		index.add("3");

    		produto = JOptionPane.showInputDialog("Digite o número do produto:\n1 - Milho\n2 - Soja\n3 - Feijão")
    				.toString();

    		if (produto.equals("1")) {
    			icms = new IcmsMilho();
    		} else if (produto.equals("2")) {
    			icms = new IcmsSoja();
    		} else if (produto.equals("3")) {
    			icms = new IcmsFeijao();
    		}

    		while (!index.contains(icms.getEstadoDaFilial())) {
    			icms.setEstadoDaFilial(JOptionPane
    					.showInputDialog("Digite o número do estado da Filial Cereais Sul:\n1 - GO\n2 - MG\n3 - DF")
    					.toString());
    		}
    		while (!index.contains(icms.getEstadoDeSaida())) {
    			icms.setEstadoDeSaida(
    					JOptionPane.showInputDialog("Digite o estado de entrada:\n 1 - GO\n2 - MG\n3 - DF").toString());
    		}
    		while (!index.contains(icms.getAtividade())) {
    			icms.setAtividade(JOptionPane
    					.showInputDialog(
    							"Digite o número da atividade do produtor:\n1 - Produtor\n2 - Cooperativa\n3 - Cerealista")
    					.toString());
    		}

    	}
    }

3 Respostas

D

Acho que é só inicializar a variável icms com valor null:

String produto = "";
Icms icms = null;
ArrayList<String> index = new ArrayList<String>();
edumatias

Bom dia amigo,

Uma classe abstrata serve apenas para demonstrar quais métodos devem ser criados (substituídos) para que o objeto fique completo.

Portanto você não irá instanciar.

Olha este exemplo que encontrei

Uma classe abstrata é como se fosse uma classe de referência e nunca deve ser instânciada.

Por exemplo, imagine a Classe Veículo, que deriva as classes Carro e Moto.
A classe Carro é uma especialização da classe Veículo, e a classe Moto é uma especialização da classe Veículo. Logo as classes Carro é Moto podem ser instânciadas, criando objetos da classe Carro e Moto, que de uma certa forma são Veículos. Sendo assim podemos dizer que a classe Veiculo contém métodos que devem ser reescritos na classe Carro e Moto, tornando a Classe Veículo Abstrata, porque nunca deveria ser instânciada, funcionando como uma referência para as classes Carro e Moto.

R

Bom dia ! Obrigado por Responderem ! @diego12 vou tentar inicia-la como null.

@edumatias Obrigado pela ajuda, exatamente esse meu problema, eu preciso iniciar a variável porém a mãe é abstrata e preciso de um if pra decidir qual das filhas instanciar, e o Java não compila de dentro do if. Na parte final do código onde tem os Whiles e usa o objeto icms.settersougetters ele fica marcando erro por não iniciar a variável.

Criado 19 de outubro de 2017
Ultima resposta 20 de out. de 2017
Respostas 3
Participantes 3