これはコールバックです。ウィキペディアによると:
コンピューター プログラミングでは、コールバックは、他のコードに引数として渡される実行可能コードへの参照です。
それでは、実行可能コードを見てみましょう。
public void getHelp(HelpCallback callback){
//do something
callback.call(OK);
}
ここで、callback
引数は type のオブジェクトへの参照HelpCallback
です。その参照は引数として渡されるため、コールバックです。
委任の例
委任は、メソッドがどのように呼び出されるかに関係なく、オブジェクトによって内部的に行われます。たとえば、callback
変数が引数ではなくインスタンス変数の場合:
class MyDriver {
public static void main(String[] argv){
// definition of HelpStrategy omitted for brevity
MyObject myObj = new MyObject(new HelpStrategy() {
@Override
public void getHelp() {
System.out.println("Getting help!");
}
});
myObj.getHelp();
}
}
class MyObject {
private final HelpStrategy helpStrategy;
public MyObject(HelpStrategy helpStrategy) {
this.helpStrategy = helpStrategy;
}
public void getHelp(){
helpStrategy.getHelp();
}
}
...それなら委任です。
ここでMyObject
は、戦略パターンを使用します。注意すべき点が 2 つあります。
- の呼び出しに
getHelp()
は、実行可能コードへの参照を渡す必要はありません。つまり、これはコールバックではありません。
MyObject.getHelp()
呼び出すという事実は、オブジェクトhelpStrategy.getHelp()
のパブリック インターフェイスまたは呼び出しからは明らかではありません。この種の情報隠蔽は、委任の特徴です。MyObject
getHelp()
また、メソッドに// do something
セクションがないことにも注意してください。getHelp()
コールバックを使用する場合、コールバックはオブジェクトの動作に関連することは何もしません。何らかの方法で呼び出し元に通知するだけなので、// do something
セクションが必要でした。ただし、委任を使用する場合、メソッドの実際の動作は委任に依存します。したがって、実際には両方が必要になる可能性があります。これらは異なる目的を果たすためです。
public void getHelp(HelpCallback callback){
helpStrategy.getHelp(); // perform logic / behavior; "do something" as some might say
if(callback != null) {
callback.call(); // invoke the callback, to notify the caller of something
}
}