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 deAudio, adicionaartista,genero,albume sobrescrevegetClassificacao()com regra própria (músicas muito populares retornam nota máxima).Podcast: herda deAudio, adicionahost,descricao,numeroEpisodioe sobrescrevegetClassificacao()valorizando curtidas.Favoritos: classe de serviço que recebe qualquerAudioe imprime uma avaliação baseada no polimorfismo degetClassificacao().Playlist: usa composição para manterList<Audio>, comadicionar,remover,listarAudios,reproduzirTudoegetDuracaoTotal().
Conceitos aplicados
| Conceito | Onde |
|---|---|
| Abstração | Audio como base do domínio |
| Encapsulamento | Atributos private + getters/setters controlados |
| Herança | Musica e Podcast estendem Audio |
| Polimorfismo | getClassificacao() sobrescrito nas subclasses |
| Composição | Playlist 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;
}
}