* Анонимни класове в 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 в нов локален клас и сме предефинирали негов метод. Тъй като на този нов локален клас не сме дали формално ново име, то той се нарича "анонимен клас".
Добави коментар