Event Bus e o padrão Observer em Java: implementação de arquitetura fracamente acoplada

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

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

Recommendations