多層バッファーを構築したい:
public class Buffer{
protected void onReadComplete(int read){
//...
// throw new RuntimeException(...);
}
public void read(...){
//...
//...
onReadCompleted(some);// we can throw RuntimeExceptions here without corrupt the field mAlreadyRead.
mAlreadyRead+=some;
return;
}
protected void checkRead(...) throws Exception{
//...
}
}
最初のレイヤー(サブクラス)では、これを行います:
Buffer lowlevel=new Buffer(){
@Override
protected void onReadComplete(int read){
super.onReadComplete(read);
//...
}
@Override
Protected void checkRead(){
//...
}
};
次に、インスタンス lowlevel がアクセスされるたびに、オーバーライドされた lowlevel.onReadComplete ルーチンを通じて通知されます。しかし、この Buffer をプログラムの別の部分に渡したいと思います。ここで重要なのは、「私のプログラムの他の部分」はインスタンスを新規作成してバッファ内のメソッドをオーバーライドするだけではなく、バッファのインスタンスを取得することだけです。そのインスタンスのメソッドをオーバーライドしてレイヤーを追加するにはどうすればよいですか? 私が欲しいのは:
Buffer higherLevel=lowlevel{
@Override
protected void onReadComplete(int read){
super.onReadComplete(read);
//...
}
}
しかし、もちろんJavaはそれを理解できません...
ただし、Java は Proxy を提供します。しかし、これを行うには、クリーンで統一された低オーバーヘッドのパフォーマンス重視の方法が必要です。
また、コールバック インターフェイスを追加することはできません。
public class BufferWrapper{
IEventBuffer event;
public read(...){
//...
event.onReadComplete(...);
//...
}
public BufferWrapper(Buffer buffer,IEventBuffer event){
buffer.event=event;
}
}
higherLevel を介してアクセスすると、両方で onReadComplete をトリガーしますが、lowlevel を介してアクセスすると、lowlevel.onReadComplete のみをトリガーします。
そして、このアプローチを使用することはできません:
Buffer higherLevel=new Buffer(lowlevel){
@Override
protected void onReadComplete(int read){
super.onReadComplete(read);
//...
}
}
onReadComplete は read(...) の途中で発生するため、もう一度 read を実装したくないからです。
私の下手な英語を許してください、私は自分の主張をしたかどうかわかりません:
…イラスト絵は作ったけど画像載せれない… -->a はインスタンス a からのアクセスを意味する
<pre>
-->lo---------------------------------->lo.onXXX
----------> hi1-->hi1.onXXX----------->lo.onXXX
----------> hi2-->hi2.onXXX----------->lo.onXXX
--> hi3--> hi2--> hi3.onXXX,hi2.onXXX->lo.onXXX
</pre>