成为Pomodoro technique的粉丝我正在制作一个倒数计时器让我完成我的作业任务。然而,这个特殊的项目不是功课。 :)
Stack有很多关于在用户输入之前使用定时器来控制延迟的问题,但在独立定时器上却没有太多问题。我从朋友那里遇到过这段代码,并且已经在Java Documentation上学过这门课程。
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)
的使用情况,我可以看到delay
和period
参数,但不能看到第一个参数之前的开放式参数。
我的第一个参数实际上是整个代码块吗?我希望整个区块被圆括号包围......但事实并非如此。这是java中的常见语法吗?我以前从未碰过它。
新的TimerTask() { public void run() { 的System.out.println(setInterval的()); } }
我只是想澄清一下,在我开始改变之前我理解它。
答案 0 :(得分:8)
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具有定义anonymous inner classes的特殊语法。匿名类是语法上的便利。您可以在使用时定义它及其TimerTask
方法,而不是在其他地方定义run()
的子类。
上面的代码等同于以下代码,匿名TimerTask
子类变为显式命名子类。
class MyTimerTask extends TimerTask
{
public void run()
{
System.out.println(setInterval());
}
}
TimerTask task = new MyTimerTask();
timer.scheduleAtFixedRate(task, delay, period);
答案 1 :(得分:2)
你是对的,第一个参数是整个代码块:
new TimerTask()
{
public void run()
{
System.out.println(setInterval());
}
}
这些声明称为匿名类,在the Java Tutorials中有更详细的解释。
答案 2 :(得分:1)
这是anonymous inner class。你需要学习内部课程才能理解这个。通常,当您不需要在代码中的其他位置使用类时,将使用此类。你不能在其他地方使用它只是因为你没有引用指向它。 您也可以按如下方式替换上述代码:
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);