C, PHP, VB, .NET

Дневникът на Филип Петров


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

 



Добави коментар

Адресът на електронната поща няма да се публикува


*