2
respostas

Projeto: Áudio, Música, Podcast, Favoritos e Playlists (POO em Java)

Neste projeto, implementei um sistema simples de mídia com músicas, podcasts, favoritos e playlists, aplicando os pilares da POO: abstração, encapsulamento, herança, polimorfismo e composição.

Linguagem: Java
Tópicos: Classes, Herança, Métodos, Encapsulamento, Listas, Polimorfismo


Explicação Técnica (resumo)

  • Audio (abstrata): superclasse com atributos e comportamentos comuns (titulo, duracao, totalReproducoes, curtidas, reproduzir(), curtir(), getClassificacao()).
  • Musica: herda de Audio, adiciona artista, genero, album e sobrescreve getClassificacao() com regra própria (músicas muito populares retornam nota máxima).
  • Podcast: herda de Audio, adiciona host, descricao, numeroEpisodio e sobrescreve getClassificacao() valorizando curtidas.
  • Favoritos: classe de serviço que recebe qualquer Audio e imprime uma avaliação baseada no polimorfismo de getClassificacao().
  • Playlist: usa composição para manter List<Audio>, com adicionar, remover, listarAudios, reproduzirTudo e getDuracaoTotal().

Conceitos aplicados

ConceitoOnde
AbstraçãoAudio como base do domínio
EncapsulamentoAtributos private + getters/setters controlados
HerançaMusica e Podcast estendem Audio
PolimorfismogetClassificacao() sobrescrito nas subclasses
ComposiçãoPlaylist contém List<Audio>
SRP (Responsabilidade Única)Cada classe faz só seu papel

Estrutura de pacotes (sugestão)

br.com.alura.audio
 ├─ modelos
 │   ├─ Audio.java
 │   ├─ Musica.java
 │   └─ Podcast.java
 ├─ servicos
 │   ├─ Favoritos.java
 │   └─ Playlist.java
 └─ Principal.java

Código-Fonte

Audio.java (superclasse abstrata)

package br.com.alura.audio.modelos;

public abstract class Audio {
    private String titulo;
    private int duracao; // em segundos
    private int totalReproducoes;
    private int curtidas;

    public void reproduzir() {
        this.totalReproducoes++;
    }

    public void curtir() {
        this.curtidas++;
    }

    // -------- Getters/Setters essenciais (encapsulamento) --------

    public String getTitulo() {
        return titulo;
    }

    public void setTitulo(String titulo) {
        this.titulo = titulo;
    }

    public int getDuracao() {
        return duracao;
    }

    public void setDuracao(int duracao) {
        if (duracao < 0) throw new IllegalArgumentException("Duração inválida");
        this.duracao = duracao;
    }

    public int getTotalReproducoes() {
        return totalReproducoes;
    }

    public int getCurtidas() {
        return curtidas;
    }

    /**
     * Método polimórfico: cada subclasse pode definir sua própria regra.
     * Implementação padrão: proporção curtidas/reproduções em escala 0..5.
     */
    public double getClassificacao() {
        if (totalReproducoes == 0) return 0.0;
        return (double) curtidas / totalReproducoes * 5.0;
    }
}

Musica.java

package br.com.alura.audio.modelos;

public class Musica extends Audio {
    private String artista;
    private String genero;
    private String album;

    @Override
    public double getClassificacao() {
        // Regra de negócio: músicas muito populares recebem nota máxima
        if (getTotalReproducoes() > 2000) return 10.0;
        // Senão, usa a regra padrão da superclasse
        return super.getClassificacao();
    }

    // Getters/Setters específicos
    public String getArtista() {
        return artista;
    }

    public void setArtista(String artista) {
        this.artista = artista;
    }

    public String getGenero() {
        return genero;
    }

    public void setGenero(String genero) {
        this.genero = genero;
    }

    public String getAlbum() {
        return album;
    }

    public void setAlbum(String album) {
        this.album = album;
    }
}
2 respostas

Continuação

Podcast.java

package br.com.alura.audio.modelos;

public class Podcast extends Audio {
    private String host;
    private String descricao;
    private int numeroEpisodio;

    @Override
    public double getClassificacao() {
        // Valoriza mais curtidas do que reproduções
        return getCurtidas() * 0.8 + getTotalReproducoes() * 0.2;
    }

    // Getters/Setters específicos
    public String getHost() {
        return host;
    }

    public void setHost(String host) {
        this.host = host;
    }

    public String getDescricao() {
        return descricao;
    }

    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }

    public int getNumeroEpisodio() {
        return numeroEpisodio;
    }

    public void setNumeroEpisodio(int numeroEpisodio) {
        this.numeroEpisodio = numeroEpisodio;
    }
}

Favoritos.java

package br.com.alura.audio.servicos;

import br.com.alura.audio.modelos.Audio;

public class Favoritos {

    public void inclui(Audio audio) {
        double nota = audio.getClassificacao();
        if (nota >= 8) {
            System.out.println(audio.getTitulo() + " é considerado EXCELENTE (nota " + nota + ")");
        } else if (nota >= 5) {
            System.out.println(audio.getTitulo() + " é MUITO BOM (nota " + nota + ")");
        } else {
            System.out.println(audio.getTitulo() + " é OK (nota " + nota + ")");
        }
    }
}

Playlist.java

package br.com.alura.audio.servicos;

import br.com.alura.audio.modelos.Audio;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Playlist {

    private final String nome;
    private final List<Audio> audios = new ArrayList<>();

    public Playlist(String nome) {
        this.nome = nome;
    }

    public void adicionar(Audio audio) {
        audios.add(audio);
        System.out.println(audio.getTitulo() + " foi adicionada à playlist " + nome);
    }

    public void remover(Audio audio) {
        audios.remove(audio);
        System.out.println(audio.getTitulo() + " foi removida da playlist " + nome);
    }

    public int getDuracaoTotal() {
        int soma = 0;
        for (Audio audio : audios) {
            soma += audio.getDuracao();
        }
        return soma;
    }

    public void listarAudios() {
        System.out.println("\nPlaylist: " + nome);
        for (Audio audio : audios) {
            System.out.println("- " + audio.getTitulo() + " (" + audio.getDuracao() + "s)");
        }
    }

    public void reproduzirTudo() {
        System.out.println("\nReproduzindo playlist " + nome + "...");
        for (Audio audio : audios) {
            audio.reproduzir();
            System.out.println("▶ Tocando: " + audio.getTitulo());
        }
    }

    public String getNome() {
        return nome;
    }

    public List<Audio> getAudios() {
        return Collections.unmodifiableList(audios);
    }
}

Principal.java (exemplo de uso)

package br.com.alura.audio;

import br.com.alura.audio.modelos.Musica;
import br.com.alura.audio.modelos.Podcast;
import br.com.alura.audio.servicos.Favoritos;
import br.com.alura.audio.servicos.Playlist;

public class Principal {
    public static void main(String[] args) {

        Musica m1 = new Musica();
        m1.setTitulo("Smells Like Teen Spirit");
        m1.setArtista("Nirvana");
        m1.setGenero("Grunge");
        m1.setDuracao(300);
        for (int i = 0; i < 2500; i++) m1.reproduzir();
        for (int i = 0; i < 1400; i++) m1.curtir();

        Musica m2 = new Musica();
        m2.setTitulo("Billie Jean");
        m2.setArtista("Michael Jackson");
        m2.setGenero("Pop");
        m2.setDuracao(290);
        for (int i = 0; i < 500; i++) m2.reproduzir();
        for (int i = 0; i < 200; i++) m2.curtir();

        Podcast p1 = new Podcast();
        p1.setTitulo("Flow #315");
        p1.setHost("Flow");
        p1.setDescricao("Entrevista com convidado especial");
        p1.setNumeroEpisodio(315);
        p1.setDuracao(3600);
        for (int i = 0; i < 300; i++) p1.reproduzir();
        for (int i = 0; i < 250; i++) p1.curtir();

        Playlist playlist = new Playlist("Minha Playlist Favorita");
        playlist.adicionar(m1);
        playlist.adicionar(m2);
        playlist.adicionar(p1);

        playlist.listarAudios();
        System.out.println("\nDuração total: " + playlist.getDuracaoTotal() + "s");
        playlist.reproduzirTudo();

        Favoritos fav = new Favoritos();
        fav.inclui(m1);
        fav.inclui(m2);
        fav.inclui(p1);
    }
}

Oi! Como vai?

A organização do projeto e da forma como aplicou os pilares da POO ficaram ótimas, deixando clara a responsabilidade de cada classe. A separação em pacotes e o uso de herança, polimorfismo e composição mostram que você entendeu bem a proposta da atividade, principalmente na implementação do método getClassificacao() e no papel da classe Playlist.

Continue evoluindo nesse caminho, refinando cada vez mais suas regras de negócio.

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