Sto studiando le classi anonime e in tutta sincerità ho capito poco.
Sul manuale c'è un esempio che dovrebbe permettere di comprendere bene il funzionamento delle classi anonime.
L'esempio è il seguente:
codice:
public class Film {
private String nome;
private String genere;
private int mediaRecensioni;
public Film (String nome, String genere, int mediaRecensioni) {
this.nome = nome;
this.genere = genere;
this.mediaRecensioni = mediaRecensioni;
}
// metodi set e get omessi
public String toString(){
return getNome();
}
}
codice:
public class Videoteca {
private Film[] films;
public Videoteca () {
films = new Film[10];
caricaFilms();
}
public void setFilms(Film[] films) {
this.films = films;
}
public Film[] getFilms() {
return films;
}
public Film[] getFilmDiFantascienza() {
Film [] filmDiFantascienza = new Film[10];
for (int i = 0, j= 0; i< 10;i++) {
if ("Fantascienza".equals(films[i].getGenere())) {
filmDiFantascienza[j] = films[i];
j++;
}
}
return filmDiFantascienza;
}
public Film[] getBeiFilm() {
Film [] beiFilms = new Film[10];
for (int i = 0, j= 0; i< 10;i++) {
if (films[i].getMediaRecensioni() >3) {
beiFilms[j] = films[i];
j++;
}
}
return beiFilms;
}
private void caricaFilms() {
// caricamento film
}
}
codice:
public class TestVideoteca {
public static void main(String args[]) {
Videoteca videoteca = new Videoteca();
System.out.println("\nFilm di Fantascienza:");
Film[] filmDiFantascienza = videoteca.getFilmDiFantascienza();
for(Film film : filmDiFantascienza)
{
if(film != null)
{
System.out.println(film);
}
}
// omesso test bei film
}
A Questo punto il manuale dice che la soluzione migliore consiste nell'utilizzo delle classi anonime:
codice:
public interface FiltroFilm
{
boolean filtra(Film film);
}
codice:
public class Videoteca {
private Film[] films;
public Videoteca () {
films = new Film[10];
caricaFilms();
}
public void setFilms(Film[] films) {
this.films = films;
}
public Film[] getFilms() {
return films;
}
public Film[] getFilmFiltrati(FiltroFilm filtroFilm) {
Film [] filmFiltrati = new Film[10];
for (int i = 0, j= 0; i< 10;i++) {
if (filtroFilm.filtra(films[i])) {
filmFiltrati[j] = films[i];
j++;
}
}
return filmFiltrati;
}
private void caricaFilms() {
// caricamento film
}
}
codice:
public class TestVideoteca {
public static void main(String args[]) {
Videoteca videoteca = new Videoteca();
System.out.println("\nFilm di Fantascienza:");
Film[] filmDiFantascienza = videoteca.getFilmFiltrati(new FiltroFilm() {
public boolean filtra(Film film) {
return"Fantascienza".equals(film.getGenere());
}
} );
stampaFilm(filmDiFantascienza);
System.out.println("Bei Film:");
Film[] beiFilms = videoteca.getFilmFiltrati(new FiltroFilm() {
public boolean filtra(Film film) {
return film.getMediaRecensioni() >3;
}
} );
stampaFilm(beiFilms);
private static void stampaFilm(Film [] films) {
for (Film film: films) {
if (film != null) {
System.out.println(film);
}
}
}
Io di questo esempio ho capito ben poco, cioè ho capito l'utilizzo delle classi anonime ma non riesco a comprendere questo specifico caso.
Mi potete aiutare nella comprensione?