Object-oriented (nesneye dayalı) programlama dillerinin en önemli özelliklerinden biri olay yönetimidir. Tabi Java’da doğuştan object-oriented bir dil olduğundan bu özelliğe sahip. Bu yazımda da olay yönetimi hakkında konuşacağız. Nasıl bir olay yakalanır ve Nasıl özelleştirilmiş olay hazırlanır konularına değineceğiz.

1- Olaylar

Olay mantığını tam olarak kavramak için aşağıdaki soruları cevaplamaya çalışacağım; Bir olay ne zaman oluşur?

Nesnemizde gerçekleşen bir işlem sonucunda oluşurlar.

a- Oluşan bu olay ne işe yarar?

Oluşan olaya göre bir işlem yapmamıza yardımcı olur.

b- Olaylar kod içinde nasıl yakalanırlar?

Olayları dinlemek için bazı arayüzleri implement ederiz. Bu sayede olaylar, sınıflar tarafından tanınırlar ve oluştuğunda onları o sırada dinleyen objeler tarafından yakalanabilinirler.

c- Olaylar en çok nerede kullanılırlar?

Farklı kullanımları mevcuttur. Bunlara örnek vermek gerekirse;

  • Arayüzde kullanıcının davranışlarını yakalamak için kullanılırlar.
  • Kütüphanelerde onları kullanan uygulamalara oluşan durumlardan haberdar etmek için kullanılırlar.
  • En çok asenkron işlemlerin sonucunu takip etmek için özel olaylar tanımlanırlar.

2- Özelleştirilmiş Olay Yönetimi

Java ile arayüz geliştirenler ActionListener arayüzünü hatırlarlar. Ben burada özelleştirilmiş bir olay oluşturup bunu yakalayan basit bir örnek yapacağım. Ve bu örneğimde daha önce Java ile asenkron programlama yazımda bahsettiğim bilgileri kullanacağım.

a- Özelleştirilmiş olay sınıfı.

import java.util.EventObject;

public class CustomEvent extends EventObject {
  public CustomEvent(Object source) {
    super(source);
  }
}

b- Özelleştirilmiş olay için dinleyici/yakalayıcı arayüz.

import java.util.EventListener;

public interface CustomEventListener extends EventListener {
  public void myCustomEventOccurred(CustomEvent event);
}

c- Asenkron çalışacak olan bir iş simulatörü.

İş sonunda bizim özelleştirilmiş olayımızı fırlatacak.

import java.util.ArrayList;
import java.util.List;

public class Worker implements Runnable {
  private List listeners = new ArrayList();

  /**
   * Olayımızı dinlemek isteyen nesneler bu metot ile kendilerini kayıt ediyorlar.
   */
  public synchronized void addEventListener(CustomEventListener listener) {
    listeners.add(listener);
  }

  /**
   * Olayımızı dinlemeyi bırakan nesneler bu metot ile kendilerinin kaydını siliyorlar.
   */
  public synchronized void removeEventListener(CustomEventListener listener) {
    listeners.remove(listener);
  }

  /**
   * Özelleştirilmiş olayı yakalamak isteyen tüm nesneler burada uyarılıyor.
   */
  private synchronized void fireEvent() {
    CustomEvent event = new CustomEvent(this);
    for (CustomEventListener listener : listeners) {
      listener.myCustomEventOccurred(event);
    }
  }

  @Override
  public void run() {
    synchronized (this) {
      try {
        Worker.this.wait(1000);
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
    }

    // Ve olayımızı fırlatıyoruz.
    fireEvent();
  }
}

d- Olayı yakalamak.

Olayları yakalamak isteyen nesnelerin sınıfları mutlaka ilgili dinleyici arayüzü implement etmek zorunda.

public class Main implements CustomEventListener {
  public void doSomethingAsynchronous() {
    Worker worker = new Worker();
    // Olayı dinlemek istediğimizi bildiriyoruz.
    worker.addEventListener(this);

    new Thread(worker).start();
  }

  /**
   * Ve olayımız fırlatıldığında çağırılacak metot burada.
   */
  @Override
  public void myCustomEventOccurred(CustomEvent event) {
    System.out.println("My custom event occured.");
  }

  public static void main(String[] args) {
    new Main().doSomethingAsynchronous();
  }
}

Kodu çalıştırdığınızda göreceğiniz üzere olay oluştuğu zaman “My custom event occured.” mesajı konsol ekranına yazılacaktır.

Bu yazımında sonuna geldik. Bir sonraki yazımda görüşmek üzere..