Event Bus e o padrão Observer em Java: como construir uma arquitetura de eventos flexível
No desenvolvimento moderno em Java, surge frequentemente a necessidade de notificar uns componentes do sistema sobre ações ocorridas em outros, sem criar uma dependência rígida entre eles. O clássico padrão Observer resolve esse problema, mas sua implementação manual pode levar ao crescimento do código, vazamentos de memória e dificuldades de depuração. Para ajudar, surge o Event Bus — uma implementação pronta do padrão "publicador-assinante" (Publish-Subscribe), que assume o gerenciamento das assinaturas e da entrega de eventos.
Neste artigo, analisaremos detalhadamente o que é Event Bus, como ele se relaciona com o padrão Observer e mostraremos um exemplo prático de uso da popular biblioteca greenrobot EventBus para aplicações Java. O material será útil para desenvolvedores que desejam criar sistemas fracamente acoplados, facilmente testáveis e escaláveis.
Padrão Observer: a base do Event Bus
O padrão Observer define uma relação "um para muitos" entre objetos: quando um objeto (publicador) muda seu estado, todos os objetos dependentes (assinantes) são automaticamente notificados. Na implementação clássica, o publicador mantém uma lista de assinantes e chama seus métodos diretamente.
Desvantagens da implementação manual:
- Acoplamento rígido: o assinante deve implementar explicitamente a interface Observer.
- Gerenciamento do ciclo de vida: é necessário cancelar a assinatura manualmente, caso contrário, podem ocorrer vazamentos de memória.
- Dificuldade de escalabilidade: com o aumento do número de assinantes, o código se torna difícil de manter.
O Event Bus resolve esses problemas atuando como um mediador central. O publicador não conhece os assinantes — ele apenas envia o evento para o barramento. O barramento encontra todos os assinantes registrados para aquele tipo de evento e entrega a mensagem a eles.
Conhecendo o greenrobot EventBus
O EventBus da greenrobot é uma biblioteca leve para Java e Android que implementa o padrão Observer usando anotações. Ela permite:
- Enviar eventos de qualquer tipo (classes POJO).
- Assinar eventos por tipo de classe.
- Escolher a thread de entrega: principal (UI), em segundo plano ou pós-thread.
- Usar prioridades de assinantes e cancelamento de eventos.
Exemplo de uso do EventBus
Vamos considerar um exemplo simples: o componente SensorManager gera eventos sobre mudança de temperatura, e dois outros componentes — Logger e AlertSystem — reagem a eles.
Passo 1: Definição do evento
O evento é uma classe Java comum que carrega dados:
public class TemperatureEvent { private final double temperature; private final String sensorId;
public TemperatureEvent(double temperature, String sensorId) { this.temperature = temperature; this.sensorId = sensorId; }
public double getTemperature() { return temperature; } public String getSensorId() { return sensorId; }}Passo 2: Criação dos assinantes
Os assinantes se registram no EventBus e marcam os métodos manipuladores com a anotação @Subscribe:
import org.greenrobot.eventbus.EventBus;import org.greenrobot.eventbus.Subscribe;
public class Logger { public void start() { EventBus.getDefault().register(this); }
@Subscribe public void onTemperatureEvent(TemperatureEvent event) { System.out.println("[LOG] Sensor " + event.getSensorId() + ": temperature is " + event.getTemperature() + "°C"); }
public void stop() { EventBus.getDefault().unregister(this); }}
public class AlertSystem { private static final double A Também na biblioteca
Validator para Go: guia completo com exemplos práticos
Biblioteca Padrão Swift: visão geral completa para iOS/macOS
Geração de QR Codes em Java: biblioteca ZXing (guia detalhado)
Java para geolocalização e mapas: bibliotecas, API e exemplos