8. groovy的面向对象
groovy来自java,当然是含有面向对象的基因。
8.1 属性和本地变量
groovy有private,protected,public等访问修饰符,但据groovy 2.0.7测试的结果,这些修饰符都是没有起作用,都是public的访问权限,这似乎是一个bug,但是尚未修复,http://jira.codehaus.org/browse/GROOVY-1875
另外groovy bean会生成getter/setter,当然你也可以覆盖set,可以通过点操作符来调用,也可以通过['propertyName']动态的来访问。
package org.jamee.hello.groovy.bean
class BeanAccessor {
def dftField;
private priField;
protected protField;
def AnotherBean ab;
}
package org.jamee.hello.groovy.bean
class AnotherBean {
def name;
void setName(def name) {
this.name = 'in setName ' + name;
}
}
package org.jamee.hello.groovy.main
import org.jamee.hello.groovy.bean.AnotherBean;
import org.jamee.hello.groovy.bean.BeanAccessor;
class GroovyTester {
static main(args) {
def ba = new BeanAccessor()
ba.dftField = 'default value'
ba.priField = 'private value'
println ba.dftField
println ba['dftField']
println ba.priField
ba.ab = new AnotherBean()
ba.ab.name = 'ab\'s name'
println ba.ab.name;
ba.protField = 'protected value'
println ba['protField']
}
}
输出:
写道
default value
default value
private value
in setName ab's name
protected value
8.2 默认参数,变长参数和命名参数
groovy借用了其他脚本语言的特性,支持默认参数和命名参数,虽然看起来不是那么友好。
class Greety {
def sayHello(person, message="good day") {
return "Hi, $person, $message"
}
def sayHellos(message, person, Object[] persons) { // like def SayHellos(message, person, ...otherPersons)
return persons.inject(message +" $person,") {words, i -> words += " $i,"}
}
def sayHello(Map namedParams) {
return "${namedParams.message}, ${namedParams.person}"
}
}
def greety = new Greety()
println greety.sayHello('jhone') // output: Hi, jhone, good day
println greety.sayHello('allen', 'how are you') // output: Hi, allen, how are you
println greety.sayHellos('good day', 'bill', 'clark', 'danny') // called like var args, output:good day bill, clark, danny,
println greety.sayHello(message:'good day', person:'eval') // output: good day, eval
8.3 方法调用
groovy的调用方法可以用字符串或字符串变量的方式,即更加方便的使用java的反射。
另外也对令人头疼的NullPointerException提供了更方便的检查方式。
class Foo {
def callme() {
return 'foo called'
}
}
def foo = new Foo()
println foo.callme() // output: foo called
println foo.'callme'() // output: foo called
def mn = 'callme'
println foo."$mn"() // output: foo called
def map = [a:[b:[c:1]]]
println map.a.b.c
// println map.a.x.c // NPE throw
println map?.a?.x?.c // protected
8.4 构造器
groovy提供了三种构造实例的方式:java传统的方式,as转换构造,和隐式构造。
另外groovy还为构造函数提供了命名参数,这样对于属性很多的类,使用就很方便了,还记得java的builder模式吧,groovy天生支持了。
class Name {
def firstName;
def lastName;
Name(firstName, lastName) {
this.firstName = firstName
this.lastName = lastName
}
def String toString() {
return this.firstName + ' ' + this.lastName
}
}
def n0 = new Name('alex', 'bell')
def n1 = ['bob','jons'] as Name
assert n1 instanceof Name
Name n2 = ['clark', 'lee']
assert n2 instanceof Name
class Person {
Name name
def age
def gender
def email
}
new Person()
p1 = new Person(name : n0)
println p1.name // output: alex bell
p2 = new Person(name : n1, email : 'bob@gmail.com')
println p2.email // output: bob@gmail.com
8.5 类,包
之前提到过,groovy是java的另一种表现形式,任何一个groovy的脚本都是编译成类的,如果一个脚本不含class,groovy会默认将整个脚本编译成一个类,并加入main方法。
groovy的包的组织形式和java一样,但groovy提供了一个我期待很久的特性,可以给一个类引用一个别名,类似于C中的typedef,这样在一个class中引用两个同名的class就不必要写很长的包名了。
import com.company.util.StringUtil
import com.myCompany.util.StringUtil as MyStringUtil
8.6 GPath,Spread,Use
GPath
可以让你用属性访问短方法调用使得你的代码更加紧凑,例如:
invoices.items.grep{ it.total() > 7000 }.product.name
对应的Java代码:
private static List getProductNamesWithItemTotal(Invoice[]
invoices) {
List result = new LinkedList();
for (int i = 0; i < invoices.length; i++) {
List items = invoices[i].getItems();
for (Iterator iter = items.iterator(); iter.hasNext();) {
LineItem lineItem = (LineItem) iter.next();
if (lineItem.total() > 7000){
result.add(lineItem.getProduct().getName());
}
}
}
return result;
}
Spread操作符(*)
可以将你的集合展开,以方便调用,python也提供了类似的操作。
list = [1,2,3]
range = 1..3
def connect(x, y, z) {
return x + y + z
}
assert 6 == connect(*list)
assert 6 == connect(*range)
Use操作符
class StringCaculationCategory {
static String plus(String first, String second) {
Integer.parseInt(first) + Integer.parseInt(second)
}
}
use(StringCaculationCategory) {
println '1' + '2'
}
分享到:
相关推荐
Groovy 入门教程 Groovy 是一种基于 Java 语言的脚本语言,运行在 JVM 中,语法与 Java 相似,但抛弃了 Java 的一些烦琐的语法规则,提供了更加简洁和灵活的编程体验。 Groovy 的特点 1. 简洁的语法:Groovy 语法...
Groovy的动态特性意味着一切皆对象,包括基本类型。例如,整数在Groovy中也是对象,可以调用其方法。此外,Groovy支持闭包(Closures),这是其强大的功能之一,可以用来创建函数式编程风格的代码。 Groovy还提供了...
Groovy不仅支持传统的面向对象编程特性,还融合了函数式编程和元编程的特性,这使得Groovy脚本成为处理日常开发任务的强大工具。 #### 二、Groovy脚本的特点 1. **与Java的高度兼容性**:Groovy可以无缝地与Java...
"OFBiz开发者装备系列:0005"可能是一个关于OFBiz开发的学习资料系列,其中的"Groovy中文教程.pdf"可能是该系列的一部分,提供了详细的Groovy语言学习内容,适合对OFBiz开发感兴趣的Java开发者阅读。而"OFBiz其它资源...
Groovy基础教程源码涵盖了Groovy语言的各个方面,是学习和理解Groovy语言的宝贵资源。下面将详细阐述Groovy的一些核心知识点。 1. **动态类型与静态类型**: Groovy支持动态类型,这意味着变量在声明时无需指定...
### Groovy 1.7 官方教程知识点详解 #### 一、Groovy简介 - **定义**:Groovy是一种灵活且动态的语言,专为Java虚拟机(JVM)设计。 - **特点**: - **继承优势**:在保留Java强项的基础上,引入了更多来自Python...
Groovy 是一种基于Java平台的面向对象语言。Groovy 的语法和 Java 非常的相似,可以使用现有的 Java 库来进行 Groovy 开发。可以将它想像成 Java 语言的一种更加简单、表达能力更强的变体。
### 精通Groovy中文教程 #### 一、Groovy简介 Groovy是一种动态语言,专门为Java平台设计,提供了一种更为简洁且灵活的语法结构。Groovy并不旨在取代Java,而是作为Java的一种补充,使得开发者能够在Java环境中...
这本书深入浅出地讲解了Groovy的各个方面,包括基础语法、面向对象特性、元编程、领域特定语言(DSL)构建以及与Java的协作等。 1. **基础语法**:Groovy的语法与Java有很高的相似性,但更加灵活。例如,变量声明...
### Groovy中文教程知识点概述 #### 一、Groovy简介与快速入门 ##### 1.1 使用Groovy - **Groovy** 是一种基于 **Java虚拟机 (JVM)** 的编程语言,它提供了简洁的语法,并且兼容Java的类库。Groovy能够直接运行在...
Groovy以其简洁的语法、动态类型和面向对象特性而受到开发者欢迎,尤其在构建自动化任务、生成代码、创建脚本和模板等方面表现突出。在这个压缩包中,我们可以看到多个以`.groovy`为扩展名的文件,这表明它们都是...
标题中的“Groovy和Java相互调用1”指的是在编程时如何在Groovy语言环境中调用Java类,以及反之,如何在Java程序中调用Groovy类。这是一种跨语言交互的方式,特别是在混合使用Groovy和Java的项目中非常常见。 ...
这篇Groovy入门教程由杨宏焱在2009年5月撰写,主要介绍了Groovy的基础知识和开发环境的配置。 首先,Groovy被定义为下一代的Java语言,它与Java兼容并运行在相同的平台上。Groovy的语法与Java相似,但更简洁,避免...
- **灵活性**:Groovy支持多种编程范式,包括面向对象、函数式和元编程,这为开发者提供了极大的自由度。 - **可扩展性**:作为Java的扩展,Groovy不仅可以与Java无缝集成,还可以利用其自身的特性(如闭包和动态...
Groovy的语法简洁,支持面向对象编程、函数式编程,并提供了许多现代语言特性,如闭包和动态类型。这使得Groovy成为快速开发、脚本编写以及构建自动化等任务的理想选择。 GroovyEclipse是一款强大的Eclipse插件,...
Groovy是一种动态、灵活的面向对象编程语言,它与Java语法兼容,但提供了更简洁的语法和更强的动态特性,使得开发更为高效。 Groovy SDK的核心组成部分包括: 1. **Groovy解释器**:这是执行Groovy代码的基础,它...
- **一切皆对象**:Groovy中,所有变量都是对象,这意味着你可以对任何类型的数据执行对象方法,即使在运行时改变其类型也是允许的。 - **与Java的兼容性**:Groovy可以直接调用Java库,与Java代码无缝集成,因为...