Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

1
resposta

Resolução

package com.github.lucasdevrj.exercicios.gerenciamentodebiblioteca;

import java.time.Year;

public abstract class Midia {

    private String titulo;
    private Year anoDeLancamento;

    public Midia(String titulo, Year anoDeLancamento) {
        this.titulo = titulo;
        this.anoDeLancamento = anoDeLancamento;
    }

    public String getTitulo() {
        return titulo;
    }

    public String getCodigo() {
        String nomenclaturaPadrao = "LIB-";
        String tresPrimeirosCaracteresDoTitulo = titulo.substring(0, 3);
        return nomenclaturaPadrao.concat(tresPrimeirosCaracteresDoTitulo).concat(String.valueOf(anoDeLancamento));
    }

    public abstract void exibirInfo();
}
package com.github.lucasdevrj.exercicios.gerenciamentodebiblioteca;

import java.time.Year;

public class Livro extends Midia {

    private String autor;

    public Livro(String titulo, Year anoDeLancamento, String autor) {
        super(titulo, anoDeLancamento);
        this.autor = autor;
    }

    @Override
    public void exibirInfo() {
        System.out.printf("Código: %s | Livro: %s - Autor: %s\n", getCodigo(), getTitulo(), autor);
    }
}
package com.github.lucasdevrj.exercicios.gerenciamentodebiblioteca;

import java.time.Year;

public class Revista extends Midia {

    private int edicao;

    public Revista(String titulo, Year anoDeLancamento, int edicao) {
        super(titulo, anoDeLancamento);
        this.edicao = edicao;
    }

    @Override
    public void exibirInfo() {
        System.out.printf("Código: %s | Revista: %s - Edição: %d\n", getCodigo(), getTitulo(), edicao);
    }

}
package com.github.lucasdevrj.exercicios.gerenciamentodebiblioteca;

import java.time.Year;

public class Ebook extends Midia {

    private String formato;

    public Ebook(String titulo, Year anoDeLancamento, String formato) {
        super(titulo, anoDeLancamento);
        this.formato = formato;
    }

    @Override
    public void exibirInfo() {
        System.out.printf("Código: %s | Ebook: %s - Formato: %s\n", getCodigo(), getTitulo(), formato);
    }
}
/**
 * Imagine que você está desenvolvendo um sistema para uma biblioteca que precisa catalogar
 * diferentes tipos de mídias: livros, revistas e e-books. Cada mídia possui informações
 * específicas, como título e ano de publicação, mas algumas têm características únicas,
 * como autor (livros), edição (revistas) ou formato (e-books). Seu programa deve ser
 * capaz de exibir esses dados para facilitar a consulta pelos bibliotecários.
 *
 * Crie um programa que:
 *
 * Defina uma classe Midia com os atributos título e ano de publicação.
 * Defina um método que gere um código no formato “LIB- + os três primeiros caracteres do
 * título + ano de publicação”, por exemplo:
 * Código: LIB-O H1937 | Livro: "O Hobbit" - Autor: J.R.R. Tolkien
 * Crie as classes Livro, Revista e Ebook, todas herdando de Midia, adicionando:
 * Livro: atributo autor.
 * Revista: atributo edição.
 * Ebook: atributo formato.
 * Cadastre uma mídia de cada tipo.
 * Exiba o código e os detalhes de cada mídia usando o método exibirInfo.
 * Exemplo de entrada:
 *
 *
 * livro.exibirInfo();
 * revista.exibirInfo();
 * ebook.exibirInfo();
 *
 * Saída esperada:
 *
 *
 * Código: LIB-O G1979 | Livro: "O Guia do Mochileiro das Galáxias" - Autor: Douglas Adams
 * Código: LIB-Nat2023 | Revista: "National Geographic" - Edição: 245
 * Código: LIB-Cle2008 | Ebook: "Clean Code" - Formato: PDF
 */

package com.github.lucasdevrj.exercicios.gerenciamentodebiblioteca;

import java.time.Year;

public class Principal {
    public static void main(String[] args) {
        Livro livro = new Livro("Ensaio sobre a Cegueira", Year.of(1995), "José Saramago");
        Revista revista = new Revista("Nintendo Power", Year.of(1998), 1);
        Ebook ebook = new Ebook("Java 8 Prático", Year.of(2014), "PDF");

        livro.exibirInfo();
        revista.exibirInfo();
        ebook.exibirInfo();
    }
}

Insira aqui a descrição dessa imagem para ajudar na acessibilidade
beleza?

1 resposta

Oi, Lucas. Tudo bem com você?

Obrigado por compartilhar mais uma resolução. Sua implementação para o gerenciamento de biblioteca atende aos requisitos propostos, utilizando herança de forma adequada para especializar cada tipo de mídia. A classe abstrata Midia centraliza os atributos e o método responsável pela geração do código, enquanto Livro, Revista e Ebook implementam o comportamento específico por meio de exibirInfo(). Também foi uma boa escolha utilizar a classe Year para representar o ano de lançamento, tornando o modelo mais expressivo do que utilizar um número inteiro.

Como sugestão de melhoria, apenas vale considerar um tratamento no método getCodigo() para títulos com menos de três caracteres, evitando uma possível exceção ao utilizar substring(0, 3). Embora os exemplos do exercício utilizem títulos maiores, essa validação deixaria a classe mais robusta para outros cenários.

Pensando na evolução desse sistema, como você implementaria uma busca que permitisse listar todas as mídias publicadas em um determinado ano ou filtrar apenas um tipo específico, como livros ou e-books?

Parabéns pela resolução e por manter uma organização consistente entre as classes. Continue compartilhando suas implementações. O fórum está à disposição para acompanhar sua evolução e esclarecer novas dúvidas.

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