Klasy anonimowe

Klasy anonimowe są spotykane dużo częściej niż klasy wewnętrzne (i ich pochodne). Nie posiadają one swojej nazwy, mogą się one odwoływać do pół klasy opakowującej, a także do zmiennych lokalnych w metodach o ile zmienne te są finalne lub efektywnie finalne. Mają dokładnie jedną instancję(pomijamy mechanizm refleksji).

Klasy anonimowe mają jeszcze jedną unikalną właściwość – pozwalają pozornie utworzyć instancję interfejsu(w rzeczywistości tworzona jest nowa klasa, w której metody takiego interfejsu musimy zaimplementować).

public interface NajwiekszaLiczba {
    public int wskazNajwieksza(int[] tab);
}

Gdybyśmy chcieli postąpić standardowo, powinniśmy napisać klasę implementującą wcześniejszy interfejs, oraz zaimplementować wszystkie jego metody.

Zamiast tego (by zyskać na wygodzie) można posłużyć się klasą anonimową:

NajwiekszaLiczba nl = new NajwiekszaLiczba() {
 
    @Override
    public int NajwiekszaLiczba(int[] tab) {
        // TODO Auto-generated method stub
        return 0;
    }
};

Fragment kodu obrazujący jak to działa:

public class PorownanieLiczb {
    public static void main(String[] args) {
        NajwiekszaLiczba nl = new NajwiekszaLiczba() {
            @Override
            public int wskazNajwieksza(int[] tab) {
                if(tab == null || tab.length == 0)
                    return 0;
                 
                int najwiekszaLiczba = tab[0];
                for(int i=1; i<tab.length; i++) {
                    if(najwiekszaLiczba < tab[i]) {
                        najwiekszaLiczba = tab[i];
                    }
                }
                return najwiekszaLiczba;
            }
        };
         
        int[] tab = {5, 10, -8, -23, 1009, 2938, 153, 24};
        System.out.println("Największa z liczb to: " + nl.wskazNajwieksza(tab));
         
    }
}

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *