14 UNUTRAŠNJE I ANONIMNE KLASE
definicija Unutrašnja (inner) klasa je klasa koja je član druge (tzv. "spoljašnje") klase kao član, ni po čemu se ne razlikuje od drugih članova (polja, metoda): može biti nestatička ili statička važe sva četiri nivoa kontrole pristupa spoljašnja klasa je u potpunosti otvorena za metode unutrašnje klase i obrnuto može se, čak, definisati i unutar metode služi, najčešće, za interne potrebe spoljašnje klase 2
sintaksa definiše se kao i svaka druga klasa class NazivKlase { .................. } s tim što se naredba class u celosti nalazi unutar naredbe class spoljašnje klase (ili unutar metode, ako je klasa unutrašnja za metodu) 3
UML SpoljašnjaKlasa UnutrašnjaKlasa 4
primer za primer spregnutog reda: kako onemogućiti bilo kakav pristup članovima liste koji su sadržani u klasi Queue? ne može se instancirati T <<interface>> Queue LinkedQueue {abstract} java.util::LinkedList PLinkedQueue T U instancira se preko ovog sam red je ovde 5
unutrašnja klasa import java.util.LinkedList; public abstract class LinkedQueue { public static <V> Queue<V> makeQueue() { return new PLinkedQueue<V>(); } private static class PLinkedQueue<U> extends LinkedList<U> implements Queue<U> { public void put(U element) { addLast(element); public U get() { return isEmpty() ? null : getFirst(); public U remove() { return removeFirst(); public boolean isFull() { return false; unutrašnja klasa 6
Queue<String> q = LinkedQueue.makeQueue(); instanciranje klasa LinkedQueue instancira se tako što se, ustvari, kreira objekat unutrašnje klase PLinkedQueue pošto je unutrašnja klasa statička, a spoljašnja apstraktna (te se ne može instancirati), instanciranje reda izvodi se primenom statičke metode makeQueue: Queue<String> q = LinkedQueue.makeQueue(); 7
new Klasa_ili_Interfejs() {opis anonimne klase} bezimene klase koje se definišu i instanciraju istovremeno najčešće se koriste pri formiranju rezultata metode, kada je on objekat anonimne klase objekat anonimne klase formira se izrazom new Klasa_ili_Interfejs() {opis anonimne klase} gde je Klasa_ili_Interfejs koju anonimna klasa nasleđuje odn. implementira 8
UML u UML se prikazuju upisivanjem stereotipa <<Anonimous>> na mesto naziva klase i vezivanjem za datu klasu vezom "biti unutrašnja klasa" 9
<<interface>> AnInterface ClassWithAnonimous <<Anonimous>> 10
public interface AnInterface { void inc(); void dec(); } //Klasa sa anonimnom unutrasnjom klasom public class ClassWithAnonimous { private int x; ClassWithAnonimous() { x = 0; public int get() { return x; //Metoda sa unutrasnjom klasom koja konkretizuje AnInterface public AnInterface value() { return new AnInterface() { public void inc() { x++; public void dec() { x--; }; definisanje i instanciranje anonimne klase koja implementira interfejs AnInterface 11