Java匿名クラスによるデバッグのシンプル化
1794 ワード
Javaでは、匿名クラス(Anonymous inner classes)がイベント(event handle)を処理するために使用されることが多い.しかし、実際にはdebugにも役立ちます.匿名クラスを使用してdebugを簡略化する方法について説明します.
独自のソースコード以外のメソッド呼び出しをどのようにデバッグすればいいですか?たとえば、Jbutton.setEnablel()の呼び出しです.Javaが提供する匿名クラスは、この問題をうまく解決することができます.
public class MyButton extends JButton
通常、クラスを継承する場合、クラス内の既存のメソッドを上書きする新しい方法を提供します.
インスタンス化(instantiate)MyButtonクラスの後、メソッドsetVisible()の呼び出しは、上のコードのsetVisible()メソッドを呼び出します.しかし、問題は、1つのメソッドを上書きするためにクラス全体を継承したくないことです.特に、必要なインスタンスが限られている場合です.匿名クラスにより、インスタンス化と同時にメソッドを上書きできます.
JButtonオブジェクトに独自のビジュアルロジックを追加したい場合は、このbuttonオブジェクトを明記しながらこの方法を書き換えることができます.
このコードは何をしましたか?カッコ({})の中間のコードはsetVisible()メソッドを明示し、JButtonクラスのそれを上書きしたが、これはmyButtonオブジェクトに限られている.JButtonクラスを変更することも、新しいクラスを明示することもなく、特殊なJButtonオブジェクトに独自の可視論理を与えただけだ.
オブジェクト指向用語では、myButtonはJButtonクラスから継承された無名、すなわち匿名、クラスのオブジェクトです.匿名クラスを作成し、メソッドを同時に上書きする技術はいつに使いますか?Swingプログラムを作成し、GUIオブジェクトにevent listener(ActionListenerと仮定)を追加するとします.以前、あなたはすでにこのようなメカニズムのコードを作成しました.今、私たちは巨大なクラスを持っていて、中にはボタンがたくさんあると仮定していますが、ボタンがあるときは隠れていて、なぜこのような異常が発生したのか知りたいと思っています.上のコードを利用してsetVisible()メソッドでブレークポイントを設定します.その後、プログラムを実行すると、設定したブレークポイントが適切な場所でプログラムを一時停止します.スタックトラック(stack trace)をチェックすると、予想通りにsetVisible()を呼び出さないことがわかります.メソッドの原因を修正します.匿名クラスは、debugがこのようなソースコードが入手できないクラスに似ている場合に役立ちます.ソースコードが入手可能な場合でも、setVisibleなどの多くの使用方法にブレークポイントを設定するのは、setVisible()を実装するたびに面倒なことです.メソッドのクラスのオブジェクトはブレークポイントに移行します.匿名クラスは特定のオブジェクトに対して「外科手術」式のdebugを行うことができます.
独自のソースコード以外のメソッド呼び出しをどのようにデバッグすればいいですか?たとえば、Jbutton.setEnablel()の呼び出しです.Javaが提供する匿名クラスは、この問題をうまく解決することができます.
public class MyButton extends JButton
通常、クラスを継承する場合、クラス内の既存のメソッドを上書きする新しい方法を提供します.
{
public void setVisible( boolean visible )
{
// Rolling our own visibility
}
}
インスタンス化(instantiate)MyButtonクラスの後、メソッドsetVisible()の呼び出しは、上のコードのsetVisible()メソッドを呼び出します.しかし、問題は、1つのメソッドを上書きするためにクラス全体を継承したくないことです.特に、必要なインスタンスが限られている場合です.匿名クラスにより、インスタンス化と同時にメソッドを上書きできます.
JButtonオブジェクトに独自のビジュアルロジックを追加したい場合は、このbuttonオブジェクトを明記しながらこの方法を書き換えることができます.
このコードは何をしましたか?カッコ({})の中間のコードはsetVisible()メソッドを明示し、JButtonクラスのそれを上書きしたが、これはmyButtonオブジェクトに限られている.JButtonクラスを変更することも、新しいクラスを明示することもなく、特殊なJButtonオブジェクトに独自の可視論理を与えただけだ.
JButton myButton = new JButton()
{
public void setVisible( boolean visible )
{
// Rolling our own visibility
}
};
オブジェクト指向用語では、myButtonはJButtonクラスから継承された無名、すなわち匿名、クラスのオブジェクトです.匿名クラスを作成し、メソッドを同時に上書きする技術はいつに使いますか?Swingプログラムを作成し、GUIオブジェクトにevent listener(ActionListenerと仮定)を追加するとします.以前、あなたはすでにこのようなメカニズムのコードを作成しました.今、私たちは巨大なクラスを持っていて、中にはボタンがたくさんあると仮定していますが、ボタンがあるときは隠れていて、なぜこのような異常が発生したのか知りたいと思っています.上のコードを利用してsetVisible()メソッドでブレークポイントを設定します.その後、プログラムを実行すると、設定したブレークポイントが適切な場所でプログラムを一時停止します.スタックトラック(stack trace)をチェックすると、予想通りにsetVisible()を呼び出さないことがわかります.メソッドの原因を修正します.匿名クラスは、debugがこのようなソースコードが入手できないクラスに似ている場合に役立ちます.ソースコードが入手可能な場合でも、setVisibleなどの多くの使用方法にブレークポイントを設定するのは、setVisible()を実装するたびに面倒なことです.メソッドのクラスのオブジェクトはブレークポイントに移行します.匿名クラスは特定のオブジェクトに対して「外科手術」式のdebugを行うことができます.