【问题标题】:What exactly is happening in this Java code snippet? [duplicate]这个 Java 代码片段到底发生了什么? [复制]
【发布时间】:2013-09-13 07:12:08
【问题描述】:

代码如下:

    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))上的提要。

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

【问题讨论】:

  • @JarrodRoberson 在stormehawke的回答之后我才知道它与anonymous-class有关。后来添加了标签
  • 这里同步语句没用。写这篇文章的人不明白他/她在做什么......

标签: java anonymous-class


【解决方案1】:

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

  • 扩展类TimerTask,例如。 G。 MyTimer extends TimerTask

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

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

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

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


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

【讨论】:

    【解决方案2】:

    这里的方法schedule 需要object of class type TimerTasktwo other arguments 的参数,可能是int and time in ms。我们通过匿名内部类传递一个对象。

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

    匿名类指南。

    1. 匿名类同时声明和初始化。
    2. 匿名类必须扩展或实现到一个且只有一个类或 接口响应。
    3. 匿名类没有名字,只能使用一次。

    【讨论】:

      【解决方案3】:

      您正在查看的内容被称为“匿名内部类”。

      在此处查看 javadoc: http://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html

      还有这个问题: How are Anonymous (inner) classes used in Java?.

      并且,为了记录,您在问题中使用的两个标签都是合适的。

      【讨论】:

      • 另外,不要因为没有立即理解它们而感到难过......当我第一次遇到匿名内部类时,它们真的让我陷入了循环:)
      猜你喜欢
      • 2012-08-29
      • 1970-01-01
      • 2018-07-28
      • 2016-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-20
      相关资源
      最近更新 更多