2
respostas

[Sugestão] Minha resolução do excercício Biblioteca

Essa de pegar caractéres da string pra formar o "código" é uma baita pegadinha. Em JavaScript usa .slice eu acho, em Java foi alguns minutos lendo documentação.

Main

public class MainLivraria {
    public static void main(String[] args) {
        Livro livro = new Livro("O Guia do Mochileiro das Galáxias", 1979, "Douglas Adams");
        Revista revista = new Revista("National Geographic", 2023, 245);
        Ebook ebook = new Ebook("Clean Code",2008 ,"PDF");

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

Mídia

public class Midia {
    protected String titulo;
    protected int anoPublicacao;

    public Midia(String titulo, int anoPublicacao) {
        this.titulo = titulo;
        this.anoPublicacao = anoPublicacao;
    }

    public String getTitulo() {
        return titulo;
    }

    public int getAnoPublicacao() {
        return anoPublicacao;
    }

    public void exibirCodigo() {
    }
}

Livro

public class Livro extends Midia {
    private String autor;

    public Livro(String titulo, int anoPublicacao, String autor) {
        super(titulo, anoPublicacao);
        this.autor = autor;
    }

    @Override
    public void exibirCodigo() {
        String codigo = titulo.substring(0,3) + getAnoPublicacao();
        System.out.println("Código: LIB-" + codigo + " | " + titulo + " - Autor: " + autor);
    }
}

Revista

public class Revista extends Midia {
    private int edicao;

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

    public int getEdicao() {
        return edicao;
    }

    @Override
    public void exibirCodigo() {
        String codigo = titulo.substring(0,3) + getAnoPublicacao();
        System.out.println("Código: LIB-" + codigo + " | " + titulo + " - Edição: " + edicao);
    }
}

Ebook

public class Ebook extends Midia {
    private String formato;

    public Ebook(String titulo, int anoPublicacao, String formato) {
        super(titulo, anoPublicacao);
        this.formato = formato;
    }

    public String getFormato() {
        return formato;
    }

    @Override
    public void exibirCodigo() {
        String codigo = titulo.substring(0,3) + getAnoPublicacao();
        System.out.println("Código: LIB-" + codigo + " | " + titulo + " - Formato: " + formato);
    }
}

Fiquei com uma dúvida, na super classe eu deixei o método de gerar o código, em branco e fui sobreescrevendo-o nas demais classes, porém fiquei com o sentimento que num caso hipotético do futuro, dar manutenção nesse código ficaria meio esquisito.

Garanta sua matrícula hoje e ganhe + 2 meses grátis

Continue sua jornada tech com ainda mais tempo para aprender e evoluir

Quero aproveitar agora
2 respostas

Oi, Gabriel, como vai?

Ficou legal como você aplicou herança e sobrescrita de exibirCodigo(). Para facilitar manutenção, transforme Midia em abstrata e centralize a lógica do código em um método protegido, por exemplo gerarCodigo(). Assim, se o formato mudar, você altera em um lugar e as subclasses só exibem seus campos.

Uma dica interessante para o futuro é usar Math.min no substring para evitar StringIndexOutOfBoundsException quando o título tiver menos de 3 letras. Veja este exemplo:


// Midia.java
public abstract class Midia {
    protected String titulo;
    protected int anoPublicacao;

    public Midia(String titulo, int anoPublicacao) {
        this.titulo = titulo;
        this.anoPublicacao = anoPublicacao;
    }

    protected String gerarCodigo() {
        String base = titulo.replaceAll("\\s+", "").toUpperCase();
        String prefixo = base.substring(0, Math.min(3, base.length()));
        return "LIB-" + prefixo + anoPublicacao;
    }

    public abstract void exibirCodigo();
}

// Livro.java (exemplo)
public class Livro extends Midia {
    private String autor;

    public Livro(String titulo, int anoPublicacao, String autor) {
        super(titulo, anoPublicacao);
        this.autor = autor;
    }

    @Override
    public void exibirCodigo() {
        System.out.println("Codigo: " + gerarCodigo() + " | " + titulo + " - Autor: " + autor);
    }
}

O que o codigo faz: remove espacos, garante maiusculas, pega ate 3 caracteres com Math.min e monta o identificador com o ano.

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

Muito obrigado pelo apoio, agora ficou bem mais claro.