这个Java代码片段究竟发生了什么?

时间:2013-09-09 18:08:00

标签: java anonymous-class

以下是代码:

    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))。

此外,我不知道哪个标签描述了这里发生的事情。如果您这样做,请添加或发表评论。

3 个答案:

答案 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 TimerTasktwo other arguments的参数,可能是int and time in ms。我们正在通过一个匿名的内部阶级传递一个对象。

代码正在创建TimerTask类的实例,但我们甚至没有给类命名 - the anonymous inner class

  

匿名类的GuideLines。

     
      
  1. 同时声明并初始化匿名类。
  2.   
  3. 匿名类必须扩展或实现一个且只有一个类或   interface resp。
  4.   
  5. 由于匿名类没有名称,因此只能使用一次。
  6.   

答案 2 :(得分:1)

正在发生的事情的逻辑等价物是:

  • 扩展课程TimerTask,e。 G。 MyTimer extends TimerTask

  • 创建新课程MyTimer mt = new MyTimer()

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

这个概念被称为匿名内部类。这就是第一步中发生的事情。第二步和第三步也可以合并。可以在需要的地方直接创建实例。这称为匿名对象

如需更多见解,请阅读这些概念。他们不难掌握。如果您需要接口的标准实例(例如GUI编程中的ActionListener),则经常使用它们。

为了完整起见,还有一个叫double brace initialization的成语。但总的来说这不是一个好习惯。