Quero fazer algo assim em Java, mas não sei o caminho:
Quando o evento "objeto 1 dizer 'olá'" acontece, o objeto 2 responde a esse evento dizendo "olá".
Alguém pode me dar uma dica ou código de exemplo?
Quero fazer algo assim em Java, mas não sei o caminho:
Quando o evento "objeto 1 dizer 'olá'" acontece, o objeto 2 responde a esse evento dizendo "olá".
Alguém pode me dar uma dica ou código de exemplo?
Respostas:
Você provavelmente deseja examinar o padrão de observador .
Aqui está um exemplo de código para você começar:
import java.util.*;
// An interface to be implemented by everyone interested in "Hello" events
interface HelloListener {
void someoneSaidHello();
}
// Someone who says "Hello"
class Initiater {
private List<HelloListener> listeners = new ArrayList<HelloListener>();
public void addListener(HelloListener toAdd) {
listeners.add(toAdd);
}
public void sayHello() {
System.out.println("Hello!!");
// Notify everybody that may be interested.
for (HelloListener hl : listeners)
hl.someoneSaidHello();
}
}
// Someone interested in "Hello" events
class Responder implements HelloListener {
@Override
public void someoneSaidHello() {
System.out.println("Hello there...");
}
}
class Test {
public static void main(String[] args) {
Initiater initiater = new Initiater();
Responder responder = new Responder();
initiater.addListener(responder);
initiater.sayHello(); // Prints "Hello!!!" and "Hello there..."
}
}
Artigo relacionado: Java: Criando um Evento Customizado
O que você deseja é uma implementação do padrão observador . Você pode fazer isso sozinho ou usar classes java como java.util.Observer
ejava.util.Observable
Existem três maneiras diferentes de configurar isso:
Thrower
dentro de Catcher
Catcher
dentro de Thrower
Thrower
e Catcher
dentro de outra classe neste exemploTest
O EXEMPLO DO GITHUB DO TRABALHO QUE EU ESTOU CITANDO O padrão é a Opção 3, para tentar os outros "Optional
"simplesmente descomente obloco de código da classe"" que você quer que seja a principal e defina essa classe como a${Main-Class}
variável nobuild.xml
arquivo:
4 coisas necessárias para jogar código lateral:
import java.util.*;//import of java.util.event
//Declaration of the event's interface type, OR import of the interface,
//OR declared somewhere else in the package
interface ThrowListener {
public void Catch();
}
/*_____________________________________________________________*/class Thrower {
//list of catchers & corresponding function to add/remove them in the list
List<ThrowListener> listeners = new ArrayList<ThrowListener>();
public void addThrowListener(ThrowListener toAdd){ listeners.add(toAdd); }
//Set of functions that Throw Events.
public void Throw(){ for (ThrowListener hl : listeners) hl.Catch();
System.out.println("Something thrown");
}
////Optional: 2 things to send events to a class that is a member of the current class
. . . go to github link to see this code . . .
}
2 Coisas necessárias em um arquivo de classe para receber eventos de uma classe
/*_______________________________________________________________*/class Catcher
implements ThrowListener {//implement added to class
//Set of @Override functions that Catch Events
@Override public void Catch() {
System.out.println("I caught something!!");
}
////Optional: 2 things to receive events from a class that is a member of the current class
. . . go to github link to see this code . . .
}
main
é estático, e não existe this
uma função estática. Você precisa criar um new Catcher1()
lugar e passar essa instância. 1.5 também não permitia this
em um contexto estático; Tenho certeza de que nunca foi permitido.
this
está em um construtor, não em main
. É por isso que funciona. Mova para main
, e eu garanto que não. É o que as pessoas tentam lhe dizer e sua resposta está tentando fazer. Eu não dou a mínima para o que está no github - eu me importo com o que está no SO. E o que você tem no SO está quebrado.
this
a partir main
, que não irá compilar em qualquer versão lançada do Java. Se essa parte estava em um construtor ou se main
criou a new Catcher1()
e usou isso em vez de this
, deve funcionar, mesmo em 1.6+.
static
é chamado de método de classe. Um método de classe é sempre invocado sem referência a um objeto específico. Uma tentativa de referenciar o objeto atual usando a palavra-chave this
ou a palavra-chave super
ou os parâmetros de tipo de qualquer ambiente circundante. declaração no corpo de um método de classe resulta em um erro em tempo de compilação. " - JLS para Java 5, §8.4.3.2
O seguinte não é exatamente o mesmo, mas semelhante, eu estava procurando por um trecho para adicionar uma chamada ao método da interface, mas encontrei esta pergunta, então decidi adicionar esse trecho para aqueles que o pesquisavam como eu e encontrei esta pergunta :
public class MyClass
{
//... class code goes here
public interface DataLoadFinishedListener {
public void onDataLoadFinishedListener(int data_type);
}
private DataLoadFinishedListener m_lDataLoadFinished;
public void setDataLoadFinishedListener(DataLoadFinishedListener dlf){
this.m_lDataLoadFinished = dlf;
}
private void someOtherMethodOfMyClass()
{
m_lDataLoadFinished.onDataLoadFinishedListener(1);
}
}
O uso é o seguinte:
myClassObj.setDataLoadFinishedListener(new MyClass.DataLoadFinishedListener() {
@Override
public void onDataLoadFinishedListener(int data_type) {
}
});