1
resposta

[Dúvida] Dúvida

Alguém pode conferir e dizer se esta errado? Desde já agradeço!

import modelos.Livro;
import modelos.ProdutoFisico;

public class App {
    public static void main(String[] args) throws Exception {
        
        Livro livro = new Livro();
        ProdutoFisico produtoFisico = new ProdutoFisico();

        livro.setPreco(100);
        livro.setDescontos(0.5);
        System.out.println("O valor do livro: " + livro.getCalcularPrecoFinal());

        produtoFisico.setPreco(40);
        produtoFisico.setDescontos(0.2);
        System.out.println("O valor do Produto: " + produtoFisico.getCalcularPrecoFinal());
    }
}

undefined

package modelos;
import modelos.Calculavel;

public class ProdutoFisico implements Calculavel{
    double preco;
    double descontos;
    double precofinal;

    public double getPreco() {
        return preco;
    }

    public void setPreco(double preco) {
        this.preco = preco;
    }

    public double getDescontos() {
        return descontos;
    }

    public void setDescontos(double descontos) {
        this.descontos = descontos;
    }

    public double getCalcularPrecoFinal(){
        return precofinal = preco - (preco * descontos);
}
}

undefined

package modelos;
import modelos.Calculavel;

public class Livro implements Calculavel{
    double preco;
    double descontos;
    double precofinal;

    public double getPreco() {
        return preco;
    }

    public void setPreco(double preco) {
        this.preco = preco;
    }

    public double getDescontos() {
        return descontos;
    }

    public void setDescontos(double descontos) {
        this.descontos = descontos;
    }

    public double getCalcularPrecoFinal(){
     return precofinal = preco - (preco * descontos);    
    }

}
undefined
package modelos;

public interface Calculavel {
    double getCalcularPrecoFinal();
}
1 resposta

Oii, Pedro! Tudo bem?

Fico feliz em ver sua dedicação nos desafios de Orientação a Objetos. É praticando que esses conceitos de interfaces e polimorfismo ficam claros.

Analisando o seu código, ele está logicamente correto e funciona para o que se propõe. Você conseguiu implementar a interface e usá-la nas classes. Mas, para seguir as boas práticas de Java e o que o desafio sugere, tenho alguns pontos para te ajudar a deixar seu código ainda melhor.

1. Nomeclatura de Métodos na Interface

Em Java, métodos que realizam cálculos ou ações geralmente começam com verbos. Você usou getCalcularPrecoFinal(). O prefixo get é usado para acessar um valor que já existe (um atributo). Como você está processando um cálculo, o ideal seria apenas calcularPrecoFinal().

2. Uso do implements

No seu código, você criou a interface Calculavel com o método getCalcularPrecoFinal(). Isso está ótimo! Apenas tenha certeza de que, ao implementar a interface, você utilize a anotação @Override acima do método nas classes Livro e ProdutoFisico. Isso ajuda o compilador a verificar se você está seguindo a interface corretamente.

3. Redundância de código (Herança)

Note que Livro e ProdutoFisico possuem exatamente os mesmos atributos (preco, descontos, precofinal) e os mesmos métodos. Em um cenário real, você poderia criar uma classe base chamada Produto para evitar repetir esse código, e as outras classes apenas herdariam dela.

Sugestão de refatoração

Veja como seu código ficaria seguindo os padrões mais comuns:

A interface

package modelos;

public interface Calculavel {
    // Um nome mais direto para a ação de calcular
    double calcularPrecoFinal();
}

A Classe ProdutoFisico (Exemplo)

package modelos;

public class ProdutoFisico implements Calculavel {
    private double preco;
    private double descontos;

    // Getters e Setters...

    @Override
    public double calcularPrecoFinal() {
        // não é necessário guardar em uma variável 'precofinal' 
        // se você só quer retornar o resultado
        return preco - (preco * descontos);
    }
}

Por que isso é bom?

  • Encapsulamento: Usei private nos atributos. Isso protege seus dados, permitindo acesso apenas via métodos.
  • Clareza: O método calcularPrecoFinal() diz exatamente o que faz.

No seu método main:

public class App {
    public static void main(String[] args) {
        Livro livro = new Livro();
        livro.setPreco(100);
        livro.setDescontos(0.5);
        
        // chamada mais limpa
        System.out.println("O valor do livro: " + livro.calcularPrecoFinal());
    }
}

Seu raciocínio sobre como usar a interface para forçar um comportamento nas classes está perfeito. O caminho é esse mesmo!

Você já pensou em como faria se o desconto do Livro fosse sempre fixo em 10% e o do ProdutoFisico dependesse de uma taxa extra?

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!