Voglio fare qualcosa del genere in Java ma non conosco il modo:
Quando l'evento "oggetto 1 dice 'ciao'" accade, allora l'oggetto 2 risponde a quell'evento dicendo "ciao".
Qualcuno può darmi un suggerimento o un codice di esempio?
Voglio fare qualcosa del genere in Java ma non conosco il modo:
Quando l'evento "oggetto 1 dice 'ciao'" accade, allora l'oggetto 2 risponde a quell'evento dicendo "ciao".
Qualcuno può darmi un suggerimento o un codice di esempio?
Risposte:
Probabilmente vuoi esaminare il modello di osservatore .
Ecco un po 'di codice di esempio per iniziare:
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..."
}
}
Articolo correlato: Java: creazione di un evento personalizzato
Quello che vuoi è un'implementazione del modello di osservatore . Puoi farlo da solo o usare classi java come java.util.Observer
ejava.util.Observable
Ci sono 3 modi diversi in cui potresti voler impostare:
Thrower
all'interno Catcher
Catcher
all'interno Thrower
Thrower
e Catcher
all'interno di un'altra classe in questo esempioTest
L'ESEMPIO GITHUB DI LAVORO CHE SONO CITING Il valore predefinito è Opzione 3, per provare gli altri a decommentare semplicemente il "Optional
" blocco di codice della classe che si desidera essere principale e impostare quella classe come${Main-Class}
variabile nelbuild.xml
file:
4 cose necessarie per lanciare il codice laterale:
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 Cose necessarie in un file di classe per ricevere eventi da una 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
statico e non esiste this
una funzione statica. Devi crearne uno new Catcher1()
da qualche parte e passare invece quell'istanza. 1.5 non ha permesso neanche this
in un contesto statico; sono abbastanza sicuro che non sia mai stato permesso.
this
è in un costruttore, non in main
. Ecco perché funziona. Spostalo in main
, e ti garantisco che non lo farà. Questo è ciò che le persone hanno cercato di dirti e ciò che la tua risposta sta cercando di fare. Non me ne frega niente di quello che c'è su Github - mi importa cosa c'è su SO. E quello che hai su SO è rotto.
this
da main
, che non verrà compilato in ogni versione rilasciata di Java. Se invece quella parte fosse in un costruttore, o se main
creata new Catcher1()
e usata e invece di quella this
, dovrebbe funzionare, anche in 1.6+.
static
viene chiamato metodo di classe. Un metodo di classe viene sempre invocato senza riferimento a un oggetto particolare. Un tentativo di fare riferimento all'oggetto corrente utilizzando la parola chiave this
o la parola chiave super
o di fare riferimento ai parametri di tipo di qualsiasi ambiente circostante la dichiarazione nel corpo di un metodo di classe genera un errore in fase di compilazione. " - JLS per Java 5, §8.4.3.2
Quanto segue non è esattamente lo stesso ma simile, stavo cercando uno snippet per aggiungere una chiamata al metodo dell'interfaccia, ma ho trovato questa domanda, quindi ho deciso di aggiungere questo snippet per coloro che lo cercavano come me e ho trovato questa domanda :
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);
}
}
L'utilizzo è il seguente:
myClassObj.setDataLoadFinishedListener(new MyClass.DataLoadFinishedListener() {
@Override
public void onDataLoadFinishedListener(int data_type) {
}
});