Criando listener em java

Quem nunca precisou controlar eventos de um sistema de forma que os interessados pudessem ser notificados quando houvesse um novo evento?

Eu falo por mim, pois sempre que precisei fazer isso em um sistema tinha que recorrer para uma pesquisa na internet. Então pensando nisso resolvi escrever de uma forma bem simples e com códigos de exemplos.

Listener

Listener como a própria tradução diz, significa ouvinte. Esse ouvinte é um interessado em um determinado assunto. Se você precisa que seu objeto seja notificado quando alguma ação ocorre esse é uma boa estratégia a ser utilizada.

  
/**
 * @author Mews
 *
 */
public interface Listener {
  public void receivedEvent(Event event);
}

Event

Event é o evento que um ou mais listeners receberão. Evento pode conter quais informações forem necessárias. No meu exemplo simplesmente criei um atributo name.

/**
 * @author Mews
 *
 */
public class Event {

	private String name;
	
	public Event(String name) {
		super();
		this.name = name;
	}

	public String getName() {
		return name;
	}
	
	public void setName(String name) {
		this.name = name;
	}
}

Dispatcher

A classe de dispatcher é a responsável por controlar quais são os interessados(listeners) e os notifica quando houver um evento. Nesse meu modelo eu fiz utilizando o padrão singleton. O singleton é muito utilizado pelos desenvolvedores. Ele possui seu construtor privado para garantir que não haja mais do que uma instância do objeto. Esse e outros padrões você pode ler no post que disponibilizei 33 design patterns com exemplos em java.

/**
 * @author Mews
 * 
 */
public class Dispatcher {

	private static Dispatcher instance;
	private Set<Listener> listeners;

	private Dispatcher() {
		this.listeners = new HashSet<Listener>();
	}

	public static Dispatcher getInstance() {
		if (instance == null) {
			instance = new Dispatcher();
		}
		return instance;
	}

	public void addListener(Listener listener) {
		this.listeners.add(listener);
	}

	public void removeListener(Listener listener) {
		this.listeners.remove(listener);
	}

	public void dispatchEvent(Event event) {
		Iterator<Listener> iterator = listeners.iterator();

		while (iterator.hasNext()) {
			Listener listener = (Listener) iterator.next();
			listener.receivedEvent(event);
		}
	}
}

Como posso ver isso funcionando?

Criei uma simples classe com o método main para que pudéssemos testar esse modelo. O teste é simples apenas para dar uma base. Lembrando que esse modelo de listener pode ser utilizado de diferentes formas.

Exemplo em um ambiente multithreads precisamos saber exatamente qual objeto presente em qual thread deverá ser notificado. Vai da sua necessidade e criatividade.

/**
 * @author Mews
 *
 */
public class Main {

	public static void main(String[] args) {
		
		// cria um novo listener que irá receber o evento
		// quando for disparado
		Listener listener = new ListenerImpl();

		
		// Adiciona o listener
		Dispatcher.getInstance().addListener(listener);
		
		// Outro modo para criar um listener (Anonymous inner type)
		Dispatcher.getInstance().addListener(new Listener() {

			@Override
			public void receivedEvent(Event event) {
				System.out.println(event.getName());
			}
		});
		
		// criando um novo evento e disparando para os listeners
		Dispatcher.getInstance().dispatchEvent(new Event("hello word"));
	}
}

A classe ListenerImpl é uma simples classe que implementa a interface listener.
Bom… não quero estender mais esse assunto para não ficar mais complexo já que era para ser simples.

Se esse modelo não for suficiente para você, deixe um comentário e podemos discutir uma forma de solucionar o seu problema.

4 responses to “Criando listener em java

  1. Willian, estou desenvolvendo um sistema para monitoramento de arquivos e achei muito interessante o seu artigo de uso de Listener, mas tentei fazer o exemplo do arquivo e vi que está faltando a classe que implementa a interface, portanto gostaria se possível de uma auxilio para fazer um exemplo prático desta implementação, isto vai me ajudar como base para o meu projeto. Desde já agradeço e aguardo.

  2. Olá Emmanuel. Nesse caso crie uma classe com um nome qualquer e implemente a interface Listener que criamos e você vai ver que obrigatoriamente será necessário implementar o método receivedEvent.

    @Override
    public void receivedEvent(Event event) {
    //exemplo
    System.out.println(event.getName());
    }

    Se isso não for suficiente, peço que você descreva melhor o seu cenário.

    Abraço

  3. Bom dia Willian bom queria saber especificamente como bloquear uma letra tipo um listener ou um evento tipo para ser mas claro exemplo quer bloquear a letra Q. Qual seria ao certo o comando ou também quero bloquear todas as letras e liberar algumas para ser mas exato
    obrigado pela atenção aguardando resposta
    se puder me ajudar ficarei grato se não puder tudo bem o que vale e a intenção
    tenha um bom dia

  4. Cara achei legal mas tá meio complicado pra mim :-(… Seguinte, tenho uma comboBox que trago o nome do funcionário e quero em uma textfield trazer o id dele para poder cadastrar a nota(é um sistema de monitoria).Se tu puder me ajudar agradeço muito.
    Valeussss….

Leave a Reply

Your email address will not be published. Required fields are marked *