3

ポモドーロテクニックのファンである私は、宿題をやり続けるためにカウントダウンタイマーを作っています。ただし、この特定のプロジェクトは宿題ではありません。:)

Stackには、タイマーを使用してユーザー入力などの前の遅延を制御することについて多くの質問がありますが、スタンドアロンタイマーについてはそれほど多くありません。私は友人からこのコードに出くわし、Javaドキュメンテーションのクラスを勉強しました。

public class Stopwatch {
    static int interval;
    static Timer timer;

    public static void main(String[] args)
    {
        Scanner sc = new Scanner(System.in);
        System.out.print("Input seconds => : ");
        String secs = sc.nextLine();
        int delay = 1000;
        int period = 1000;
        timer = new Timer();
        interval = Integer.parseInt( secs );
        System.out.println(secs);
        timer.scheduleAtFixedRate(new TimerTask()
        {
            public void run()
            {
                System.out.println(setInterval());
            }
        }, delay, period);
    }
    private static final int setInterval()
    {
        if( interval== 1) timer.cancel();
        return --interval;
    }
}

私にはわかりにくい構文がいくつかあります。検討:

timer.scheduleAtFixedRate(new TimerTask()
{
     public void run()
     {
          System.out.println(setInterval());
     }
}, delay, period);

かっこと中かっこがどのように機能するのかわかりません。一見すると、の使用法を考えると、とパラメーターscheduleAtFixedRate(TimerTask task, long delay, long period)は表示されますが、最初のパラメーターの前に開いているパラメーターは表示されません。delayperiod

私の最初のパラメータは実際にはこのコードブロック全体ですか?ブロック全体が括弧で囲まれていると思いますが、そうではありません。これはJavaの一般的な構文ですか?私はこれまでに遭遇したことがありません。

new TimerTask(){public void run(){System.out.println(setInterval()); }}

変更をいじり始める前に、理解していることを明確にしておきたいと思います。

4

3 に答える 3

9
timer.scheduleAtFixedRate(new TimerTask()
{
     public void run()
     {
          System.out.println(setInterval());
     }
}, delay, period);

new TimerTaskこのコードは、がローカル変数に割り当てられるこのリファクタリングと同等です。

TimerTask task = new TimerTask()
{
     public void run()
     {
          System.out.println(setInterval());
     }
};

timer.scheduleAtFixedRate(task, delay, period);

もちろん、奇妙な部分は少し上に移動しました。new TimerTask正確には、これは何ですか?

Javaには、匿名内部クラスを定義するための特別な構文があります。匿名クラスは構文上便利です。他の場所のサブクラスを定義する代わりに、使用時にそのサブクラスとそのメソッドTimerTaskを定義できます。run()

上記のコードは次のコードと同等であり、匿名TimerTaskサブクラスが明示的な名前付きサブクラスに変換されています。

class MyTimerTask extends TimerTask
{
     public void run()
     {
          System.out.println(setInterval());
     }
}

TimerTask task = new MyTimerTask();
timer.scheduleAtFixedRate(task, delay, period);
于 2013-03-22T13:13:51.083 に答える
2

正解です。最初のパラメータはコードブロック全体です。

new TimerTask()
{
     public void run()
     {
          System.out.println(setInterval());
     }
}

これらの宣言は匿名クラスと呼ばれ、Javaチュートリアルで詳しく説明されています。

于 2013-03-22T13:12:14.527 に答える
1

匿名の内部クラスです。これを理解するには、内部クラスを勉強する必要があります。通常、このようなクラスは、コード内の他の場所でクラスを使用する必要がない場合に使用されます。それを指している参照がないという理由だけで、他の場所でそれを使用することはできません。 上記のコードを次のように置き換えることもできます。

class MyTimerTask extends TimerTask {

        @Override
        public void run() {
            // Timer task code goes here.
             System.out.println(setInterval());
        }

    }
    MyTimerTask timerTask = new MyTimerTask();
    timer.scheduleAtFixedRate(timerTask, delay, period);
于 2013-03-25T06:15:42.530 に答える