以下是代码:
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
类的对象来安排操作。根据eclipse,传递给schedule
方法的参数是(TimerTask task,long delay, long period)
。但是看一下这段代码,整个代码块作为第一个参数而不是对TimerTask
类的引用传递。我以前从未见过这样的方法。到底发生了什么?
一些背景知识:schedule
对象的Timer
方法用于定期更新Xively上的Feed(以前是COSM(以前的pachube))。
此外,我不知道哪个标签描述了这里发生的事情。如果您这样做,请添加或发表评论。
答案 0 :(得分:8)
你所看到的被称为“匿名内在阶级”。
在这里查看javadoc: http://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html
这个问题: How are Anonymous (inner) classes used in Java?
而且,对于记录,您在问题中使用的两个标签都是合适的。
答案 1 :(得分:2)
此处的schedule
方法需要object of class type TimerTask
和two other arguments
的参数,可能是int and time in ms
。我们正在通过一个匿名的内部阶级传递一个对象。
代码正在创建TimerTask
类的实例,但我们甚至没有给类命名 - the anonymous inner class。
匿名类的GuideLines。
- 同时声明并初始化匿名类。
- 匿名类必须扩展或实现一个且只有一个类或 interface resp。
- 由于匿名类没有名称,因此只能使用一次。
醇>
答案 2 :(得分:1)
正在发生的事情的逻辑等价物是:
扩展课程TimerTask
,e。 G。 MyTimer extends TimerTask
创建新课程MyTimer mt = new MyTimer()
实际函数调用timer.schedule(mt, 0, 5*1000);
这个概念被称为匿名内部类。这就是第一步中发生的事情。第二步和第三步也可以合并。可以在需要的地方直接创建实例。这称为匿名对象。
如需更多见解,请阅读这些概念。他们不难掌握。如果您需要接口的标准实例(例如GUI编程中的ActionListener
),则经常使用它们。
为了完整起见,还有一个叫double brace initialization的成语。但总的来说这不是一个好习惯。