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:

时间: 2025-01-20 16:50:36

groovy-实现接口的相关文章

嵌入Groovy

Groovy就其本身而言,在不同的场景下都算是一门非常不错的编程语言,特别是在与Java混用的环境下,Groovy显得更加强大.出于这种考虑,Groovy被设计成非常轻量级,并且易于嵌入到任何Java应用系统中. 目前主要有3种方法将Groovy与Java集成起来,细节会在下文中讨论. 还有一种可选方案是,如果你确实需要使用其他脚本语言,可以利用Bean Scripting Framework将任何脚本语言集成到你的Java代码中(虽然我们难以想象这么做的原因). 利用shell执行脚本或者表达

Groovy探索之MOP 五 针对接口类型的动态性

这里所说的接口类型,在Java语言和Groovy语言中,当然是既包括了基类类型和接口.所谓"接口类型的动态性",指的是在运行期内给基类或接口动态的添加方法,使得基类以及它的子类.接口的实现,都能访问这些方法. 这个功能一向是我比较感兴趣的一个功能.因为我们在编程的实践中,会使用各种各样的应用API,还有JDK,在使用它们的过程中,可能有一些接口及它们的子类我们会经常使用到,但是在使用的过程中,我们又感到非常的不方便.这时候,我们可以使用Categories机制来对我们所使用的类进行扩充

手把手教你接口自动化测试 – SoapUI & Groovy

原文:手把手教你接口自动化测试 – SoapUI & Groovy 手把手教你接口自动化测试 – SoapUI & Groovy   关键词:SoapUI接口测试,接口自动化测试,数据驱动测试,SoapUI进阶使用, Groovy in SoapUI, SoapUI中Groovy的使用,数据分离.   阅读这篇文章需要一定的SoapUI基础,至少入过门,另外还需要一些Groovy的知识,当然如果你会java 也可以,这里用到的Groovy知识和Java很类似. 另外,本文的思路和我上一篇文

groovy/java自实现json解析器(3)JsonArray

底层数据结构实现 jsonArray的底层数据结构有列表(list)来维护.它的定义和构造函数初始化工作如下图所示.一般创建对象时默认不传参来构造一个空的列表. def jsonList //底层数据存储结构 /** * 构造函数,若不传参数,默认初始一个 */ def JsonArray( jsonList = null){ this.jsonList = jsonList == null ? [] :jsonList } 公共调用API 下面定义了一些对外提供的API接口工具函数: /**

《Groovy语言规范》-语法

原文链接  译者:王山山 语法 本章节涵盖了Groovy编程语言的语法.Groovy语言的语法源自Java语法,为Groovy增强了特定构造,允许一定程度上的简化语法. 1.注释 1.1.单行注释 单行注释以//开始,在一行中任何位置都可以被发现.//后面的字符,直到一行的末尾都是注释的一部分. // a standalone single line comment println "hello" // a comment till the end of the line 1.2.多行

Groovy、Scala 和 Clojure 如何将行为融入到类中

Java 语言的设计有目的地进行了一定的删减,以避免前代产品中已发现的一些问题.例如,Java 语言的 设计人员感觉 C++ 中的多重继承性带来了太多复杂性,所以它们选择不包含该特性.事实上,他们在该语言 中很少构建扩展性选项,仅依靠单一继承和接口. 其他语言(包括 Java 下一代语言)存在巨大的扩 展潜力.在本期和接下来的两期文章中,我将探索扩展 Java 类而不涉及继承性的途径.在本文中,您会了解 如何向现有类添加方法,无论是直接还是通过语法糖 (syntactic sugar). 表达式

从Groovy到Java 8

Groovy开发人员早已熟知Java 8中新引入的概念和新的语言结构了.在Java新版本即将推 出的增强特性中,有很多是Groovy在几年前就已经提供了的.从用于函数式编程风格的新语 法,到lambdas表达式.collection streaming和要把方法引用作为一等公民,Groovy开发人 员在未来编写Java代码时具有先天性优势.本文将重点关注Groovy和Java 8的共同点,并阐 述了Java 8如何解读Groovy中那些熟悉的概念. 我们先来讨论一下函数式编程风格, 目前在Gro

Groovy探索 自定义Range 一 一个简单的自定义Range类

这将是一个系列的文字,用来扩展我们对于自定义Range类的使用思路.也许我们在Groovy语言的编码不知不觉的使用到了Range类,甚至没有觉察到它的存在:或者我们在Groovy语言的编码过程中,常常惊叹于使用Range类的方便,但仅仅是惊叹而已,我们没有付之行动:或者我们想在实际编码中使用自定义的Range类,但却找不到使用它的适当地方.等等,所有这些,希望在读完我们的这个系列后,我们能够将被动的使用Range类,转化为主动的使用我们自定义的Range类. Groovy语言引入的一个重要概念就

Groovy探索 as关键字的深入使用

在前面的系列<Groovy Tip 20 "as"关键字的用法>中,我们已经谈到了"as"关键字的一些激动人心的用法.本篇则要接着前篇的内容说下去,继续来展现"as"关键字的一些更为激动人心的用法. 在前一篇中,我们谈到了"as"关键字的一个用法是进行类型转换.最常用的是形如下面的用法: def list = ['a','b','c'] println list.class def strs = list as S

Groovy探索之反射

我们知道,在Java语言中,我们能够获取到Java语言的动态性,主要是通过它的反射机制来实现的.而在Groovy语言中,我们将会有很多方式来获取它的动态性,比如MOP等等.因此,在Groovy语言中,我们需要在运行期内调用某个方法,将不会使用反射机制,虽然我们仍然能够在Groovy语言中使用反射机制来达到目的:而是使用MOP机制,或者使用"duck type".因为这些机制都比反射来得方便和灵活. 这是否说明,我们在Groovy语言的程序开发过程中将不再使用到反射机制呢?我们说,反射机