Solucionado (ver solução)
Solucionado
(ver solução)
9
respostas

valor da variável de um construtor não é modificado

Olá a todos, estou fazendo no Android-Studio uma Activity para gerar uma nota de Corretagem, mas o problema esta na programação Java então não estou no fórum errado. Seguinte, eu tenho uma classe genérica chamada Mercado

public class Mercado implements Movimentos{
    protected   double fatorTick;
    protected   double custoB3;
    private final double pisConfins=0.095;
    private final double darf=0.21;

O fatorTick é o fator de conversão do tick do papel em reais e o custo da bolsa também varia de mercado para mercado, então tenho essas três classes mais especificas :

public class Indice extends Mercado {
        public void Indice()

        {
                fatorTick = 5;
                custoB3 = 0.32;
        }

public class Acoes extends Mercado {

        public void Acoes()
        {
                fatorTick=1;
                custoB3=0.0003153;
        }

public class Dolar extends Mercado {

    public void Dolar() 
    {
            fatorTick = 0.1;
                custoB3 = 1.06;
    }

Porem no primeiro método que é para calcular o valor bruto da operação

 @Override
    public double CalcBruto(double nContratos, double abertura, double fechamento, boolean comprado) {
        double total;
        if(comprado)
            total=fechamento-abertura;
        else
            total=abertura-fechamento;
        total=(total*nContratos)/fatorTick;

        return total;
    }

Me retorna INFINITY porque o valorTick é igual a ZERO! mesmo fazendo isso na MainActivity

    Mercado win =new Indice();
    Mercado wdo =new Dolar();
    Mercado acao=new Acoes();

O que funcionaria nessa implementação e porque não funciona dp jeito que está???

9 respostas

Olá Marcelo!

Tenta usar o this no construtor pra ver se funciona: this.fatorTick = 5;

Dessa forma:

public void Indice() {
    this.fatorTick = 5;
    this.custoB3 = 0.32;
 }

Aguardo seu retorno!

Não da certo meu querido, nem o this e o super funcionam.

Eu fiz de outro jeito que funcionou que foi rescrever o método que calcula esses valores. Mas como o alemão fala "o código cheirou mal", pois precisou copiar código. Vou deixar aberto pra ver se alguém aparece para explicar e obrigado por responder minha duvida.

Esperai, você como moderador é instrutor também?

Eu vi agora que você é moderador, desculpe a resposta seca. Eu estava esperando algum instrutor para tirar minha duvida sobre a sequência de execução de linha de código Ex:

Quando eu declarei o valor no construtor é possível que quando ele passa da classe filha para classe pai o valor da classe filha é sobre escrita pela classe pai por causa da sequencia de execução. como a classe filha foi instanciada primeiro e depois a classe pai foi instanciada então o valor da variável na execução do método fica com o valor da classe pai. Eu acho que é isso.

Boa noite, Marcelo! Como vai?

O método CalcBruto() está definido em qual classe?

Obs.: Apenas um detalhe que é importante ser destacado é que seguindo as convenções de codigo Java o nome correto do método CalcBruto() seria calcBruto()!

Obrigado pela dica Gabriel, essa pratica eu tenho desde da minha programação de MCUs da Microship e eu tenho que me policiar

O calcBruto esta na classe Mercado e essa é a classe pai

Tenta algo parecido com isso:

public class Mercado implements Movimentos{
    protected double fatorTick;
    protected double custoB3;
    private final double pisConfins;
    private final double dar;

    public Mercado(double fatorTick, double custoB3) {
        this.fatorTick = fatorTick;
        this.custoB3 = custoB3;
        this.pisConfins = 0.095;
        this.darf = 0.21;
    }
    ...
} 
public class Indice extends Mercado {
        public void Indice() {
            super(5, 0.32);
        }

public class Acoes extends Mercado {

        public void Acoes() {
            super(1, 0.0003153);
        }

public class Dolar extends Mercado {

    public void Dolar()  {
            super(0.1, 1.06);
    }

Seguinte, eu vou colocar a solução aqui desse problema pois já estou refatorando o programa e a solução é o mesmo que o Niko começou a fazer quando mostrou as Interfaces. Wellingon, seu código tem a mesmo sintaxe que o código mostrado com uma pequena diferença, o seu código não compila. Então vamos lá. A proposta é calcular o custo operacional de uma movimentação de contratos e ações na bolsa. Cada mercado tem como custo três partes: 1-Custo da corretora, que é a taxa de corretagem mais o imposto de serviço do mesmo 2- Custo de taxas da Bolsa, que são a taxa de registro da operação mais os emolumentos que são taxas de alienações 3- Impostos, caso haja lucro na operação, é retido 1% do liquido mais 20% que deverá ser pago através de uma Darf. E os mercados por enquanto são três que são: 1- Ações - lote padrão de 100 papeis e geralmente a corretagem é fixa por ordem executada 2- Índice - é o contrato do valor dos pontos ponderados da Bolsa, sua corretagem é calculada através de números de contratos negociados e não por ordem executada. 3- Dólar - sua corretagem é igual ao do Índice. Então vamos as códigos: 1-Criei uma interface com as seguintes assinaturas

public interface Movimentos {
     double fatorTick(double contratos, double ticks);
     double custoB3(double contratos,double entrada);
     double corretagem(double contratos,double corretagem);
}

2-Criei a Classe pai mercado

public class Mercado implements Movimentos {
    protected final double impostoCorretagem=0.0965;
    private final double impostoDarf=0.21;
    private final double impostoRetido=0.01;
    public double darf(double bruto,double corretagem, double b3){
        double total;
        total=bruto-corretagem-b3;
        if(total<0)
            return 0;
        total=total*impostoDarf;
        return total;
    }
    public double liquido(double bruto,double corretagem,double b3){
        double total;
        total=bruto-corretagem-b3;
        if(total<0)
        return total;
        total=total-(total*impostoRetido);
        return total;
    }
    public double tickTotal(double entrada, double saida, boolean comprado) {
        double total;
        if (comprado)
            total = saida - entrada;
        else
            total = entrada - saida;
        return total;
    }
    @Override
    public double fatorTick(double contratos, double ticks) {
        return 0;
    }
    @Override
    public double custoB3(double contratos,double entrada) {
        return 0;
    }
    @Override
    public double corretagem(double contratos,double corretagem){
        double total;
        total=(contratos*corretagem)*2;
        total=total+(total*impostoCorretagem);
        return total;
    }
}

3-Quando criei as classes filhas, ao invés de só jogar os valores como estava fazendo, eu re-escrevi as assinaturas dentro das classes como o Niko fez

public class Acoes extends Mercado {
    private final double emolumentos=0.0003153;
    @Override
    public double fatorTick(double contratos, double ticks) {
        double dinheiro;
        dinheiro=ticks*contratos;
        return dinheiro;
    }
    @Override
    public double custoB3(double contratos,double entrada) {
        double total;
        total= contratos*entrada;
        total=total*emolumentos;
        return total;
    }
    @Override
    public double corretagem(double contratos,double corretagem){
        double total;
        total=corretagem*2;
        total=total+(total*impostoCorretagem);
        return total;
    }
}
public class Dolar extends Mercado  {
    private final double registroEmolumentos=1.06;
    @Override
    public double fatorTick(double contratos,double ticks) {
        double dinheiro;
        dinheiro=(contratos*ticks)/0.1;
        return dinheiro;
    }
    @Override
    public double custoB3(double contratos,double entrada) {
        double total;
        total=contratos*2;
        total=total*registroEmolumentos;
        return total;
    }
}
public class Indice extends Mercado {
    private final double registroEmolumentos=0.32;
    @Override
    public double fatorTick(double contratos,double ticks) {
        double dinheiro;
        dinheiro=(ticks*contratos)/5;
        return dinheiro;
    }

    @Override
    public double custoB3(double contratos,double entrada) {
        double total;
        total=contratos*2;
        total=total*registroEmolumentos;
        return total;
    }
}
solução!

Ao invés de fazer tudo só na classe mercado eu re escrevo a assinatura através do @Override e faço o tratamento necessário do tipo de mercado, ai olha que legal No MainActivity eu seleciono o tipo de mercado através do Radio Button instancio o objeto mercado dessa forma

Mercado bolsa=Null;
if(mercadoId==acoes.getId()){
                    bolsa=new Acoes();
                }
                else if(mercadoId==indice.getId()){
                    bolsa=new Indice();
                }
                else if(mercadoId==dolar.getId()){
                    bolsa=new Dolar();
                }

E ai o polimorfismo funciona perfeitamente.