6

コードは次のとおりです。

    timer.schedule(new TimerTask() 
    {
       public void run()
       {
            synchronized(this)
            {
                 try 
                 {   
                   // System.out.println(" ITERATION = ");

                     pachubeCLI.update(78164);  

                 } 
                 catch (PachubeException e)
                 {
                        // If an exception occurs it will print the error message from the
                        // failed HTTP command
                        System.err.println(e.errorMessage);
                 } 
                 catch (IOException e) 
                 {
                        System.err.println(e);
                 } 

             }
        }
    }, 0, 5*1000);

Timerコードは基本的に、クラスのオブジェクトを使用して操作をスケジュールするために使用されていることがわかります。scheduleEclipse によると、メソッドに渡されるパラメータは次のとおり(TimerTask task,long delay, long period)です。TimerTaskしかし、このコードを見ると、クラスへの参照ではなく、コードのブロック全体が最初のパラメーターとして渡されています。そのような方法は今まで見たことがありません。ここで正確に何が起こっているのですか?

背景: オブジェクトのscheduleメソッドは、TimerXively (以前の COSM (以前の pachube)) のフィードを定期的に更新するために使用されています。

また、どのタグがここで何が起こっているかを説明しているのかわかりません.もしそうなら、それを追加するか、コメントにドロップしてください.

4

3 に答える 3

2

ここでのメソッドは、 、および、おそらくscheduleの引数を期待しています。匿名の内部クラスを介してオブジェクトを渡しています。object of class type TimerTasktwo other argumentsint and time in ms

コードはクラスのインスタンスを作成していますが、TimerTaskクラスに名前さえ付けていません。これが匿名内部クラスです。

匿名クラスのガイドライン。

  1. 匿名クラスは宣言と初期化が同時に行われます。
  2. 匿名クラスは、ただ 1 つのクラスまたはインターフェイス resp に拡張または実装する必要があります。
  3. 匿名クラスには名前がないため、一度しか使用できません。
于 2013-09-09T18:17:01.343 に答える
1

起こっていることの論理的な等価物は次のとおりです。

  • クラスの拡張TimerTask、例えばMyTimer extends TimerTask

  • 新しいクラスのインスタンスを作成するMyTimer mt = new MyTimer()

  • 実際の関数呼び出しtimer.schedule(mt, 0, 5*1000);

この概念は匿名内部クラスと呼ばれます。それがステップ1で起こっていることです。ステップ 2 と 3 を組み合わせることもできます。インスタンスは、必要な場所に直接作成できます。これを匿名オブジェクトと呼びます。

詳細については、これらの概念を読んでください。それらを把握するのは難しくありません。インターフェイスの標準インスタンスが必要な場合 ( ActionListenerGUI プログラミングなど) によく使用されます。


完全を期すために、二重ブレースの初期化と呼ばれるイディオムもあります。しかし、それは一般的に良い習慣ではありません。

于 2013-09-09T18:23:06.913 に答える