2017-02-26 8 views
1

基本的な問題です。私はクラスBにいくつかのタスクを与えるクラスAを持っています。クラスBは、クラスAに通知する必要があります。私はクラスBにコールバックとして登録する必要があります。Java簡易コールバック

私は本当にこのようにしたいObservableインタフェースを持つオブザーバパターンで

public class A 
{ 
    public void A() 
    { 
     B b = new B() 
     b.registerCallback(callback); 
    } 

    private void callback() 
    { 

    } 

} 

public class B 
{ 
    private ???? callbackoNotify; 

    public class registerCallback(??? callback) 
    { 
     callbackoNotify = callback; 
    } 

    public void notify() 
    { 
     callback(); 
    } 
} 

答えて

1

コールバックにinterfaceを定義できます。

interface Callback{ 
    void call(); 
} 

次に、クラスAに実装します。

class A implements Callback{ 
    private B b; 

    public A(){ 
     b = new B(); 
     b.registerCallback(this); 
    }  

    // Implementation of the callback interface 
    public void call(){ 

    } 
} 

次に、クラスBにコールバックを処理させます。

public class B 
{ 
    private Callback callbackoNotify; 

    public class registerCallback(Callback callback) 
    { 
     callbackoNotify = callback; 
    } 

    public void notify() 
    { 
     callbackNotify.call(); 
    } 
} 

しかし、上記のシナリオでは、callbackNotifyヌルすることができます。したがって、そのコールバックをコンストラクタでBに渡すことができる方が良いです。

あなたは考えがあるといいですね。

+0

そして、クラスAは、パブリックメソッド」を持っています誰もが呼ぶことができるコール "、Bだけができるはずです。 – aQuu

+0

したがって、Callbackを拡張する抽象クラスを作成します。 Bを、呼び出しを行う保護されたメソッドでAを拡張する具象クラスにします。 これらの問題が最初に発生している場合は、Ratpackなどの非同期フレームワークを調べる必要があります。 – ninnemannk

+0

@aQuuそれはインターフェイスの使用です。 OOPでは、この 'call'メソッドを呼び出す場合、' Callback'型のオブジェクトを持つべきです。もしaが 'A'型の' a.call() 'を実行しているなら、それは悪い習慣です。クラスBでも、コールバックへの参照を 'Callback'型で保持します。 –

2

コールバックを使用せずにこれを行うこともできます。ここでは例です:

A a = ... 
B b = ... 

はのは、bがこのようなdoTask方法を持っているとしましょう:

public void doTask(Runnable task); 

Aは次のようにそれを呼び出すことができます。

b.doTask(() -> {System.out.println("Hi There");}); 

しかし、Aが知らされることはありませんタスクが完了したとき。

Runnable taskForB =() -> {System.out.println("Hi There");}; 
Runnable wrapperForTaskWithCallback =() -> { 
    taskForB.run(); 
    taskWasFinished(); 
}; 

をそして代わりに、ラッパーのタスクを実行します:あなたは、単にこのようにタスクを変更することができ

b.doTask(wrapperForTaskWithCallback); 

をと方法を与える:

public void taskWasFinished();