groovy-实现接口

简介:

Groovy提供了一些非常方便的方法来实现接口

使用闭包实现接口

只有一个方法的接口可以使用闭包来实现,例如

1 // a readable puts chars into a CharBuffer and returns the count of chars added
2 def readable = { it.put("12 34".reverse()); 5 as Readable
3  
4 // the Scanner constructor can take a Readable
5 def s = new Scanner(readable)
6 assert s.nextInt() == 43

 

当然也可以使用闭包来实现不止一个方法的接口.这个闭包将会被这个接口的所有的方法调用.例如:

1 interface X {
2     void f()
3     void g(int n)
4     void h(String s, int n)
5 }
6  
7 x = {Object[] args -> println "method called with $args"as X
8 x.f()
9 x.g(1)
10 x.h("hello",2)

使用map实现接口

通常情况下,接口中都会包含多个方法,我们可以使用map来实现接口,比如:

1 impl = [
2   i: 10,
3   hasNext: { impl.i > 0 },
4   next: { impl.i-- },
5 ]
6 iter = impl as Iterator
7 while ( iter.hasNext() )
8   println iter.next()

 

请注意,这是一个有点做作的例子,但说明了这个概念。

你只需要实现接口中会被调用的方法, 如果你调用了一个在map中并不存在的方法的话,那么将会抛出NullPointerException 异常。 例如:

1 interface X
2 void f(); void g(int n); void h(String s, int n); }
3  
4 x = [ f: {println "f called"} ] as X
5 x.f()
6 //x.g()    // NPE here

你能猜出下面的代码做了什么么?

1 x = { f: {println "f called"} } as X
2 x.f()
3 x.g(1)

我们在这里定义的是一个闭包,一个标签一个代码块,我们刚刚定义了一个每个接口方法都会调用的闭包, 一些语言使用{}来定义map,所以这可能误导你,请记住在groovy中定义map使用[:]。

注意:使用as操作符需要你有一个你打算使用map实现的接口的静态引用。如果你有一个代表你想实现的接口的java.lang.Class 对象的引用,你就可以如同下面的方式一样使用asType 方法:

1 def loggerInterface = Class.forName( 'my.LoggerInterface' )
2 def logger = [
3                log : { Object[] params -> println "LOG: ${params[0]}";if( params.length > 1 ) params[1].printStackTrace() },
4                close : { println "logger.close called" }
5              ].asType( loggerInterface )

See also:

目录
相关文章
|
5月前
|
Java 编译器
Java编译器注解运行和自动生成代码问题之如何定义@BuildProperty注解
Java编译器注解运行和自动生成代码问题之如何定义@BuildProperty注解
|
Java
【Groovy】Groovy 动态语言特性 ( Groovy 语言与 Java 语言执行效率对比 | 以动态特性编译的 Groovy 类 | 以静态特性编译的 Groovy 类 )
【Groovy】Groovy 动态语言特性 ( Groovy 语言与 Java 语言执行效率对比 | 以动态特性编译的 Groovy 类 | 以静态特性编译的 Groovy 类 )
296 0
|
XML 敏捷开发 IDE
Groovy 的介绍和简单的使用
Groovy 的介绍和简单的使用
|
Java
【Groovy】Groovy 代码创建 ( 使用 Java 语法实现 Groovy 类和主函数并运行 | 按照 Groovy 语法改造上述 Java 语法规则代码 )
【Groovy】Groovy 代码创建 ( 使用 Java 语法实现 Groovy 类和主函数并运行 | 按照 Groovy 语法改造上述 Java 语法规则代码 )
256 0
【Groovy】Groovy 代码创建 ( 使用 Java 语法实现 Groovy 类和主函数并运行 | 按照 Groovy 语法改造上述 Java 语法规则代码 )
【Groovy】编译时元编程 ( 编译时处理 ASTTransformation 接口实现 | 配置 ASTTransformation )
【Groovy】编译时元编程 ( 编译时处理 ASTTransformation 接口实现 | 配置 ASTTransformation )
253 0
【Groovy】编译时元编程 ( 编译时处理 ASTTransformation 接口实现 | 配置 ASTTransformation )
【Groovy】Groovy 方法调用 ( 使用闭包创建接口对象 | 接口中有一个函数 | 接口中有多个函数 )
【Groovy】Groovy 方法调用 ( 使用闭包创建接口对象 | 接口中有一个函数 | 接口中有多个函数 )
287 0
【Groovy】Groovy 方法调用 ( 使用闭包创建接口对象 | 接口中有一个函数 | 接口中有多个函数 )
|
Java API
字节码编程,Javassist篇五《使用Bytecode指令码生成含有自定义注解的类和方法》
到本章为止已经写了四篇关于字节码编程的内容,涉及了大部分的API方法。整体来说对 Javassist 已经有一个基本的使用认知。那么在 Javassist 中不仅提供了高级 API 用于创建和修改类、方法,还提供了低级 API 控制字节码指令的方式进行操作类、方法。
248 0
字节码编程,Javassist篇五《使用Bytecode指令码生成含有自定义注解的类和方法》
|
Java
【Groovy】Groovy 脚本调用 ( Java 类中调用 Groovy 脚本 )
【Groovy】Groovy 脚本调用 ( Java 类中调用 Groovy 脚本 )
649 0
|
Java
【Groovy】Groovy 扩展方法 ( Groovy 扩展方法引入 | 分析 Groovy 中 Thread 类的 start 扩展方法 )
【Groovy】Groovy 扩展方法 ( Groovy 扩展方法引入 | 分析 Groovy 中 Thread 类的 start 扩展方法 )
303 0