文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
6. 内部类
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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论