私はJavaでこのようなことをしたいのですが、方法がわかりません。
イベント「object 1 say 'hello'」が発生すると、object 2はそのイベントに「hello」と応答します。
誰かから私にヒントやサンプルコードをもらえますか。
おそらく オブザーバパターン を調べたいでしょう。
ここにあなた自身を始めるためのいくつかのサンプルコードがあります:
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..."
}
}
関連記事: Java:カスタムイベントの作成
あなたが欲しいのは observerパターン の実装です。完全に自分でやることも、Java.util.Observer
やJava.util.Observable
のようなJavaクラスを使うこともできます。
これを設定するには3つの方法があります。
Thrower
の内部Catcher
Catcher
の内部Thrower
Thrower
およびCatcher
Test
ワーキングGITHUBの例I CITINGデフォルトはオプション3で、他の人は単に "Optional
"メインにしたいクラスのコードブロック、およびそのクラスを${Main-Class}
ファイルのbuild.xml
変数として設定します。
4サイドコードのスローに必要なもの:
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クラスからイベントを受け取るためにクラスファイルで必要なもの
/*_______________________________________________________________*/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 . . .
}
以下は全く同じではありませんが似ています、私はinterfaceメソッドへの呼び出しを追加するためのスニペットを探していましたが、この質問を見つけたので、私はそれを探している人のためにこのスニペットを追加することにしました
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);
}
}
使い方は次のとおりです。
myClassObj.setDataLoadFinishedListener(new MyClass.DataLoadFinishedListener() {
@Override
public void onDataLoadFinishedListener(int data_type) {
}
});