* Анонимни класове в Java
Публикувано на 15 октомври 2009 в раздел ПИК3 Java.
"Анонимните" класове са специален вид локални класове. Специалното при тях е, че те нямат специални имена и на тях винаги правим само една инстанция.
Нека вземем за пример изчисляването на дължината на хипутенизата на правоъгълен триъгълник. "Не-анонимно" би било извикването на програмата:
double a = 3; double b = 4; double c = Math.sqrt(a*a + b*b); System.out.println(c);
Защо обаче трябва да пазим променливата "c" ако не я използваме повече в програмата след това? Ако тя не ни е нужна, то ние по-често изписваме:
double a = 3; double b = 4; System.out.println(Math.sqrt(a*a + b*b));
Така променливата "хипутенуза" се създава в момента на извикването на System.out.println. Ние не сме дали име на стойността, която предаваме като параметър, тоест ние не можем да я използваме по-нататък. Това е съвсем нормално ако не се нуждаем от тази стойност отново. Това е пример за анонимни локални променливи.
Анонимните локални класове действат по същия принцип. Всъщност ние вече неведнъж ги демонстрирахме, но неявно. Например когато дефинирахме буферирани потоци към файлове:
BufferedReader in = new BufferedReader(new FileReader("text.txt"));
Ние на практика не сме подали никакво име на файловия поток. Така той се използва само и единствено от създадения буфер.
Ето и как самите ние можем да създадем анонимен клас:
public class AnonymousClassExample{ public static void main(String[] args){ Dog sparky = new Dog("Sparky"); sparky.speak(); sparky.play(); Dog terry = new Dog("Terry"){ public void speak(){ System.out.println("This dog do not want to speak"); } }; terry.speak(); terry.play(); } } interface AnimalsActions{ public void speak(); public void play(); } abstract class Animal{ private String name; public Animal(String name){ this.name = name; } abstract void speak(); abstract void play(); } class Dog extends Animal implements AnimalsActions{ public Dog(String name){ super(name); } public void speak(){ System.out.println("Woof!"); } public void play(){ System.out.println("The dog rolled over..."); } }
Виждате, че при декларирането на второто куче ние предефинирахме метод "speak". Чисто функционално това е все едно, че сме наследили клас Dog в нов локален клас и сме предефинирали негов метод. Тъй като на този нов локален клас не сме дали формално ново име, то той се нарича "анонимен клас".
Добави коментар