返回介绍

6. 内部类

发布于 2025-01-04 00:44:51 字数 1310 浏览 0 评论 0 收藏 0

Groovy 中的匿名内部类和内嵌类的实现跟 Java 是一样的,但你不应拿 Java 语言规范来考量它,应对差异情况保持冷静与宽容。已完成的实现看起来有点类似 groovy.lang.Closure 类的实现。一方面,这使得访问私有字段和方法可能会比较麻烦,但另一方面,本地变量也不必非要设置成 final 了。

6.1 静态内部类

下面是一个静态内部类的例子:

class A {
  static class B {}
}

new A.B()

静态内部类是最受支持的,所以如果你确实需要一个内部类,应该首先考虑静态内部类。

6.2 匿名内部类

import java.util.concurrent.CountDownLatch
import java.util.concurrent.TimeUnit

CountDownLatch called = new CountDownLatch(1)

Timer timer = new Timer()
timer.schedule(new TimerTask() {
  void run() {
    called.countDown()
  }
}, 0)

assert called.await(10, TimeUnit.SECONDS)

6.3 创建非静态内部类的实例

在 Java 中,你可以这样做:

public class Y {
  public class X {}
  public X foo() {
    return new X();
  }
  public static X createX(Y y) {
    return y.new X();
  }
}

而 Groovy 不支持 y.new X() ,需要使用 new X(y) ,如下所示:

public class Y {
  public class X {}
  public X foo() {
    return new X()
  }
  public static X createX(Y y) {
    return new X(y)
  }
}

然而,要注意的是,在 Groovy 中,调用的方法可以有形参而没有实参。在这种情况下,形参可能取 null。调用构造函数通常也适用于此规则。不过危险的是,以上述代码为例,你必须写为 new X() ,而不是 new X(this) 。这可能也是一种处理该问题的常规方法,目前对此也没有更好的解决办法。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文