1
resposta

[Projeto] Desafio: hora da prática - Parte 2

4 - Lembre-se: serializar um objeto é conseguir representá-lo de alguma forma em um arquivo. Aqui, você deve instanciar um objeto do tipo Tarefa e fazer com que o conteúdo do objeto vá para o arquivo tarefa.json. Para isso, utilize o Jackson para te auxiliar na tarefa. Observação: para criar novos arquivos, podemos utilizar new File("tarefa.json").

@SpringBootApplication
public class ContadorApplication implements CommandLineRunner {

    public static void main(String[] args) {
        SpringApplication.run(ContadorApplication.class, args);
    }

    @Override
    public void run(String... args) throws Exception {

        Tarefa tarefa = new Tarefa("Resolver lista de exercícios", false, "Aline");
        ObjectMapper mapper = new ObjectMapper();
        mapper.writeValue(new File("tarefa.json"), tarefa);
        System.out.println("Arquivo criado.");

5 - Agora, você fará o oposto da atividade anterior: a desserialização de um arquivo, que é ler os valores de um arquivo específico e transformar em um objeto. Leia o conteúdo do arquivo tarefa.json, produzido no exercício anterior, e o transforme em um objeto do tipo Tarefa. Exiba o conteúdo do objeto na tela.

@SpringBootApplication
public class ContadorApplication implements CommandLineRunner {

    public static void main(String[] args) {
        SpringApplication.run(ContadorApplication.class, args);
    }

    @Override
    public void run(String... args) throws Exception {

        Tarefa tarefa = new Tarefa("Resolver lista de exercícios", false, "Aline");
        ObjectMapper mapper = new ObjectMapper();
        mapper.writeValue(new File("tarefa.json"), tarefa);
        System.out.println("Arquivo criado.");

        Tarefa tarefaLida = mapper.readValue(new File("tarefa.json"), Tarefa.class);
        System.out.println(tarefaLida);
    }
}

6 - Vamos criar objetos genéricos. Imagine que você trabalha em um site que oferece várias coisas: venda de produtos, serviços de instalação desses produtos e assinatura de alguns itens. Todas essas coisas têm algo em comum: podem ser avaliadas pelos consumidores. Crie uma classe genérica de Avaliação, de modo que possamos ter, por exemplo: Avaliacao, Avaliacao e Avaliacao. Essa classe deve ter o item genérico de avaliação, a nota e um comentário sobre a nota.
Tendo criado a classe genérica, você também pode criar um método para calcular as médias das notas recebidas, independente do tipo de item avaliado.

package br.com.alura.contador.model;

import java.util.List;

public class Avaliacao<T> {
    private T item;
    private double nota;
    private String comantario;

    public Avaliacao() {
    }

    public Avaliacao(T item, double nota, String comantario) {
        if (nota < 0 || nota > 10) {
            throw new IllegalArgumentException("Nota inválida. Digite uma nota entre 0 e 10.");
        }
        this.item = item;
        this.nota = nota;
        this.comantario = comantario;
    }

    public T getItem() {
        return item;
    }

    public double getNota() {
        return nota;
    }

    public String getComantario() {
        return comantario;
    }

    public void setNota(double nota) {
        if (nota < 0 || nota > 10) {
            throw new IllegalArgumentException("Nota inválida. Digite uma nota entre 0 e 10.");
        }
        this.nota = nota;
    }

    public void setComantario(String comantario) {
        this.comantario = comantario;
    }

    public static <T> double calcularMedia (List<Avaliacao<T>> avaliacoes) {
        if (avaliacoes.isEmpty()) {
            throw new IllegalArgumentException("A lista de avaliações está vazia.");
        }
        double soma = 0;
        for (Avaliacao<T> avaliacao : avaliacoes) {
            soma += avaliacao.nota;
        }
        return soma / avaliacoes.size();
    }

    @Override
    public String toString() {
        return "Avaliação {" + "Item: " + item + " | Nota: " + nota + " | Comantário: " + comantario + "}";
    }
}
@SpringBootApplication
public class ContadorApplication implements CommandLineRunner {

    public static void main(String[] args) {
        SpringApplication.run(ContadorApplication.class, args);
    }

    @Override
    public void run(String... args) throws Exception {

        Avaliacao<String> aval1 = new Avaliacao<>("Produto1", 8.5, "Superou as expectativas.");
        Avaliacao<String> aval2 = new Avaliacao<>("Produto1", 7.5, "Ok.");

        List<Avaliacao<String>> listaAvaliacoes = new ArrayList<>();
        listaAvaliacoes.add(aval1);
        listaAvaliacoes.add(aval2);

        double media = Avaliacao.calcularMedia(listaAvaliacoes);
        System.out.println("A média das avaliações é: " + media);
    }
}
1 resposta

Oi, Aline. Como vai?

Agradeço por compartilhar seu código com a comunidade Alura.

Gostei de ver como você aplicou serializacao e desserializacao com ObjectMapper, além de estruturar uma classe generica como Avaliacao<T> com validação de nota e um método reutilizável pra calcular a media. Um ponto que chamou atenção foi sua organização ao testar tudo no CommandLineRunner, o que ajuda bastante a verificar o comportamento na prática.

Uma dica interessante para o futuro é usar @JsonProperty quando quiser deixar os nomes do JSON mais claros ou diferentes dos atributos da classe.


public class Tarefa {

    @JsonProperty("descricao")
    private String descricao;

    @JsonProperty("concluida")
    private boolean concluida;

    @JsonProperty("responsavel")
    private String responsavel;
}

Esse código define nomes personalizados no arquivo JSON, o que facilita a leitura e a integração com outras aplicações.

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