Ich möchte so etwas in Java machen, aber ich kenne den Weg nicht:
Wenn das Ereignis "Objekt 1 sagt" Hallo "" eintritt, antwortet Objekt 2 auf dieses Ereignis mit "Hallo".
Kann mir jemand einen Hinweis oder Beispielcode geben?
Ich möchte so etwas in Java machen, aber ich kenne den Weg nicht:
Wenn das Ereignis "Objekt 1 sagt" Hallo "" eintritt, antwortet Objekt 2 auf dieses Ereignis mit "Hallo".
Kann mir jemand einen Hinweis oder Beispielcode geben?
Antworten:
Sie möchten wahrscheinlich das Beobachtermuster untersuchen .
Hier ist ein Beispielcode, mit dem Sie beginnen können:
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..."
}
}
In Verbindung stehender Artikel: Java: Erstellen eines benutzerdefinierten Ereignisses
Was Sie wollen, ist eine Implementierung des Beobachtermusters . Sie können es komplett selbst machen oder Java-Klassen wie java.util.Observer
und verwendenjava.util.Observable
Es gibt drei verschiedene Möglichkeiten, wie Sie dies einrichten möchten:
Thrower
Innen Catcher
Catcher
Innen Thrower
Thrower
und Catcher
innerhalb einer anderen Klasse in diesem BeispielTest
DAS ARBEITSGITHUB-BEISPIEL, DAS ICH ZITIERE Standardmäßig wird Option 3 verwendet, um die anderen zu testen , einfach das Kommentar "Optional
Codeblock der Klasse aus, die Sie als Hauptklasse verwenden möchten, und legen Sie diese Klasse als ${Main-Class}
Variable in der build.xml
Datei fest:
4 Dinge, die beim Werfen von Seitencode benötigt werden:
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 Dinge, die in einer Klassendatei benötigt werden, um Ereignisse von einer Klasse zu empfangen
/*_______________________________________________________________*/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
es statisch ist und es keine this
statische Funktion gibt. Sie müssen new Catcher1()
irgendwo eine erstellen und stattdessen diese Instanz übergeben. 1.5 erlaubte auch this
in einem statischen Kontext nicht; Ich bin mir ziemlich sicher, dass es nie erlaubt wurde.
this
befindet sich in einem Konstruktor, nicht in main
. Deshalb funktioniert es. Bewegen Sie es zu main
, und ich garantiere, dass es nicht wird. Das ist es, was die Leute versucht haben, Ihnen zu sagen, und was Ihre Antwort versucht, zu tun. Es ist mir egal, was auf Github läuft - es ist mir egal, was auf SO läuft. Und was Sie auf SO haben, ist kaputt.
this
aus main
, die nicht in irgendeiner freigegebenen Version von Java kompilieren. Wenn sich dieser Teil stattdessen in einem Konstruktor befindet oder wenn ein main
erstellt new Catcher1()
und stattdessen verwendet wird this
, sollte er auch in Version 1.6+ funktionieren.
static
wird als Klassenmethode bezeichnet. Eine Klassenmethode wird immer ohne Verweis auf ein bestimmtes Objekt aufgerufen. Es wird versucht, das aktuelle Objekt mit dem Schlüsselwort this
oder dem Schlüsselwort super
zu referenzieren oder auf die Typparameter einer Umgebung zu verweisen Die Deklaration im Hauptteil einer Klassenmethode führt zu einem Fehler bei der Kompilierung. " - JLS für Java 5, §8.4.3.2
Das Folgende ist nicht genau dasselbe, aber ähnlich. Ich habe nach einem Snippet gesucht, um einen Aufruf zur Schnittstellenmethode hinzuzufügen, aber diese Frage gefunden. Deshalb habe ich beschlossen, dieses Snippet für diejenigen hinzuzufügen, die wie ich danach gesucht haben und diese Frage gefunden haben ::
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);
}
}
Die Verwendung ist wie folgt:
myClassObj.setDataLoadFinishedListener(new MyClass.DataLoadFinishedListener() {
@Override
public void onDataLoadFinishedListener(int data_type) {
}
});