`
jamie.wang
  • 浏览: 344831 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

groovy简明教程(六)面向对象

    博客分类:
  • Java
阅读更多

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入门教程[参照].pdf

    Groovy 入门教程 Groovy 是一种基于 Java 语言的脚本语言,运行在 JVM 中,语法与 Java 相似,但抛弃了 Java 的一些烦琐的语法规则,提供了更加简洁和灵活的编程体验。 Groovy 的特点 1. 简洁的语法:Groovy 语法...

    Groovy入门教程.doc

    Groovy的动态特性意味着一切皆对象,包括基本类型。例如,整数在Groovy中也是对象,可以调用其方法。此外,Groovy支持闭包(Closures),这是其强大的功能之一,可以用来创建函数式编程风格的代码。 Groovy还提供了...

    Groovy中文教程

    "OFBiz开发者装备系列:0005"可能是一个关于OFBiz开发的学习资料系列,其中的"Groovy中文教程.pdf"可能是该系列的一部分,提供了详细的Groovy语言学习内容,适合对OFBiz开发感兴趣的Java开发者阅读。而"OFBiz其它资源...

    groovy基础教程源码,很全面

    Groovy基础教程源码涵盖了Groovy语言的各个方面,是学习和理解Groovy语言的宝贵资源。下面将详细阐述Groovy的一些核心知识点。 1. **动态类型与静态类型**: Groovy支持动态类型,这意味着变量在声明时无需指定...

    groovy 1.7官方教程

    ### Groovy 1.7 官方教程知识点详解 #### 一、Groovy简介 - **定义**:Groovy是一种灵活且动态的语言,专为Java虚拟机(JVM)设计。 - **特点**: - **继承优势**:在保留Java强项的基础上,引入了更多来自Python...

    Groovy教程.7z

    Groovy 是一种基于Java平台的面向对象语言。Groovy 的语法和 Java 非常的相似,可以使用现有的 Java 库来进行 Groovy 开发。可以将它想像成 Java 语言的一种更加简单、表达能力更强的变体。

    精通 Groovy 中文教程

    ### 精通Groovy中文教程 #### 一、Groovy简介 Groovy是一种动态语言,专门为Java平台设计,提供了一种更为简洁且灵活的语法结构。Groovy并不旨在取代Java,而是作为Java的一种补充,使得开发者能够在Java环境中...

    Groovy中文版教程

    这本书深入浅出地讲解了Groovy的各个方面,包括基础语法、面向对象特性、元编程、领域特定语言(DSL)构建以及与Java的协作等。 1. **基础语法**:Groovy的语法与Java有很高的相似性,但更加灵活。例如,变量声明...

    Groovy Script 入门

    Groovy不仅支持传统的面向对象编程特性,还融合了函数式编程和元编程的特性,这使得Groovy脚本成为处理日常开发任务的强大工具。 #### 二、Groovy脚本的特点 1. **与Java的高度兼容性**:Groovy可以无缝地与Java...

    Groovy中文教程.pdf

    ### Groovy中文教程知识点概述 #### 一、Groovy简介与快速入门 ##### 1.1 使用Groovy - **Groovy** 是一种基于 **Java虚拟机 (JVM)** 的编程语言,它提供了简洁的语法,并且兼容Java的类库。Groovy能够直接运行在...

    groovy模板

    Groovy以其简洁的语法、动态类型和面向对象特性而受到开发者欢迎,尤其在构建自动化任务、生成代码、创建脚本和模板等方面表现突出。在这个压缩包中,我们可以看到多个以`.groovy`为扩展名的文件,这表明它们都是...

    groovy和Java相互调用1

    标题中的“Groovy和Java相互调用1”指的是在编程时如何在Groovy语言环境中调用Java类,以及反之,如何在Java程序中调用Groovy类。这是一种跨语言交互的方式,特别是在混合使用Groovy和Java的项目中非常常见。 ...

    Groovy入门教程(一).docx

    这篇Groovy入门教程由杨宏焱在2009年5月撰写,主要介绍了Groovy的基础知识和开发环境的配置。 首先,Groovy被定义为下一代的Java语言,它与Java兼容并运行在相同的平台上。Groovy的语法与Java相似,但更简洁,避免...

    Groovy DSL

    - **灵活性**:Groovy支持多种编程范式,包括面向对象、函数式和元编程,这为开发者提供了极大的自由度。 - **可扩展性**:作为Java的扩展,Groovy不仅可以与Java无缝集成,还可以利用其自身的特性(如闭包和动态...

    groovy入门经典,groovyeclipse 插件

    Groovy的语法简洁,支持面向对象编程、函数式编程,并提供了许多现代语言特性,如闭包和动态类型。这使得Groovy成为快速开发、脚本编写以及构建自动化等任务的理想选择。 GroovyEclipse是一款强大的Eclipse插件,...

    Groovy教程学习资料宣贯.pdf

    - **一切皆对象**:Groovy中,所有变量都是对象,这意味着你可以对任何类型的数据执行对象方法,即使在运行时改变其类型也是允许的。 - **与Java的兼容性**:Groovy可以直接调用Java库,与Java代码无缝集成,因为...

    Groovy学习资料

    Groovy结合了Java的面向对象特性和Python、Ruby的简洁语法,使得它成为Java开发者进行快速开发、自动化任务以及编写简洁代码的理想选择。这份"Groovy学习资料"包含了深入理解和实践Groovy所需的关键知识点,帮助...

Global site tag (gtag.js) - Google Analytics