这段Java代码片段到底在发生什么?

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类的对象来安排操作。根据eclipse的说法,传递给schedule方法的参数是(TimerTask task,long delay, long period)。但是,看着这段代码,整个代码块作为第一个参数传递,而不是对TimerTask类的引用。我从未见过这样的方法。这里到底发生了什么?
一些背景:正在使用Timer对象的schedule方法定期更新Xively(以前是COSM(以前是pachube))上的源。
另外,我不知道哪个标签描述了这里发生的事情。如果您知道,请添加或在评论中提供。

2
@JarrodRoberson 在 stormehawke 的回答之后我才知道它与匿名类有关。稍后添加了标签。 - Flame of udun
同步语句在这里是无用的。写这个代码的人不理解他/她在做什么... - assylias
3个回答

8

1
此外,不要因为一开始无法理解它们而感到难过...匿名内部类在我第一次遇到它们时真的让我感到困惑 :) - StormeHawke

2
这里的schedule方法需要一个TimerTask类对象和其他两个参数,可能是int和毫秒时间。我们通过匿名内部类传递了一个对象。
代码创建了TimerTask类的实例,但我们甚至没有给这个类起个名字——这就是匿名内部类
匿名类的指导原则如下:
  1. 匿名类同时声明和初始化。
  2. 匿名类必须仅扩展或实现一个类或接口。
  3. 由于匿名类没有名称,因此它只能使用一次。

1
发生的逻辑等效于:
  • 扩展类TimerTask,例如 MyTimer extends TimerTask

  • 创建新类的实例MyTimer mt = new MyTimer()

  • 实际函数调用timer.schedule(mt, 0, 5*1000);

该概念被称为匿名内部类。这就是步骤一中正在发生的事情。步骤二和三也可以合并。可以在需要它们的地方直接创建实例。这被称为匿名对象
要深入了解这些概念,您应该阅读相关内容。它们不难理解。如果需要接口的标准实例(例如GUI编程中的ActionListener),它们经常被使用。
为了完整起见,还有一种习语叫做双括号初始化。但通常不是一个好的实践。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接