* Анонимни класове в Java

Публикувано на 15 октомври 2009 от Филип Петров. Записано в 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 в нов локален клас и сме предефинирали негов метод. Тъй като на този нов локален клас не сме дали формално ново име, то той се нарича „анонимен клас“.



Trackback URI | RSS за коментарите

Пусни коментар