Segue a resolução do exercício.
Classe Titulo:
package br.com.alura.screenmatch.modelos;
import br.com.alura.screenmatch.calculos.Classificavel;
public class Titulo implements Comparable<Titulo>{
private String nome;
private int anoDeLancamento;
private int duracaoEmMinutos;
private boolean incluidoNoPlano;
private double somaDasAvaliacoes;
private int totalDeAvaliacoes;
public Titulo(String nome, int anoDeLancamento) {
this.nome = nome;
this.anoDeLancamento = anoDeLancamento;
}
//Getters and Setters
public double pegaMedia() {
if (totalDeAvaliacoes != 0) {
return somaDasAvaliacoes/totalDeAvaliacoes;
} else {
return 0.0;
}
}
public void avalia(double avaliacao){
somaDasAvaliacoes += avaliacao;
totalDeAvaliacoes++;
}
@Override
public String toString() {
return "\n[" + this.getNome() + " (" + this.getAnoDeLancamento() + "), " +
", duração: " + this.getDuracaoEmMinutos() + " minutos]";
}
@Override
public int compareTo(Titulo o) {
return this.getNome().compareTo(o.getNome());
}
}
Classe Filme:
package br.com.alura.screenmatch.modelos;
import br.com.alura.screenmatch.calculos.Classificavel;
public class Filme extends Titulo implements Classificavel {
private String diretor;
public Filme(String nome, int anoDeLancamento) {
super(nome, anoDeLancamento);
}
public Filme(String nome, String diretor, int anoDeLancamento, int duracaoEmMinutos) {
super(nome, anoDeLancamento);
this.setDuracaoEmMinutos(duracaoEmMinutos);
this.setDiretor(diretor);
}
public String getDiretor() {
return diretor;
}
public void setDiretor(String diretor) {
this.diretor = diretor;
}
@Override
public int getClassificacao() {
return (int) pegaMedia()/2;
}
@Override
public String toString() {
return "\n[" + this.getNome() + " (" + this.getAnoDeLancamento() + "), " +
"diretor: " + this.diretor + ", duração: " + this.getDuracaoEmMinutos() + " minutos]";
}
}
Classe Serie:
package br.com.alura.screenmatch.modelos;
public class Serie extends Titulo {
private int numeroTemporadas;
private boolean ativa;
private int episodiosPortemporada;
private int minutosPorEpisodio;
public Serie(String nome, int anoDeLancamento) {
super(nome, anoDeLancamento);
}
//Getters and Setters
@Override
public int getDuracaoEmMinutos() {
return minutosPorEpisodio * episodiosPortemporada * numeroTemporadas;
}
@Override
public String toString() {
return "\n[" + this.getNome() + " (" + this.getAnoDeLancamento() + ")" +
", duração: " + this.getDuracaoEmMinutos() + " minutos]";
}
}
Classe PrincipalComListas:
package br.com.alura.screenmatch.principal;
import br.com.alura.screenmatch.modelos.Filme;
import br.com.alura.screenmatch.modelos.Serie;
import br.com.alura.screenmatch.modelos.Titulo;
import java.io.Serial;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
public class PrincipalComListas {
public static void main(String[] args) {
Filme filme1 = new Filme("O Poderoso Chefão", 1970);
Filme filme2 = new Filme("Avatar", 2023);
Filme filme3 = new Filme("Dogville", 2003);
Serie serie1 = new Serie("Supernatural", 2005);
ArrayList<Titulo> lista = new ArrayList<>();
lista.add(serie1);
lista.add(filme1);
lista.add(filme2);
lista.add(filme3);
System.out.println("\nLista antes da ordenação: " + lista);
Collections.sort(lista);
System.out.println("\nLista depois da ordenação: " + lista);
}
}
Output:
Lista antes da ordenação: [
[Supernatural (2005), duração: 0 minutos],
[O Poderoso Chefão (1970), diretor: null, duração: 0 minutos],
[Avatar (2023), diretor: null, duração: 0 minutos],
[Dogville (2003), diretor: null, duração: 0 minutos]]
Lista depois da ordenação: [
[Avatar (2023), diretor: null, duração: 0 minutos],
[Dogville (2003), diretor: null, duração: 0 minutos],
[O Poderoso Chefão (1970), diretor: null, duração: 0 minutos],
[Supernatural (2005), duração: 0 minutos]]
Process finished with exit code 0