`
scanfprintf123
  • 浏览: 80556 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Groovy的named parameter

阅读更多

Groovy的named parameter 一般有两个用途:

1. 用在groovybean的构造函数中,提供一种便利的方式来创建新对象。

2. 用在方法中(static or not-static),如果传入的参数是named parameter的话,那么该方法会自动收集这些named parameter,然后当成该方法的第一个参数。

 

我们先来看看第一种用途,假设我们有下面的groovybean:

 

 

class Person { 
         String name
         int age 
}

 

 

那么groovy会自动的为这个groovybean生成一个带map为参数的构造函数,类似于下面:

 

 

class Person {
	String name
	int age
	Person(Map map) { map.each {k,v->
			this."${k}"=v
		}
	}
}

 

 

 

那么我们在创建Person对象的时候,可以通过如下方式来进行:

 

 

class TestMain { 
	
	static main(args) { 
		def p =new Person([name:'yezi',age:25]) 
		println p.name 
		println p.age
	}
}

 

 

实际上下面这两句是等价的:

 

 

def p =new Person([name:'yezi',age:25]) 
def p =new Person(name:'yezi',age:25)

 

方括号是可选的。

 

如果你使用过SPRING的dataBinder来讲HttpServletRequest的参数直接绑定成对象的话,那么就会发现我们也可以通过这个特性来完成spring dataBinder的这个feature。

 

 

def httpReq=... 
httpReq.setAttribute("name","yezi") 
httpReq.setAttribute("age",25)

def p = new Person(httpReq.getParams)

 

接下来让我们看看第二种用法,我们定义了printlnSth方法:

 

 

class Person {
	String name 
	int age 
	void printlnSth(def params, def otherParams) { 
		println params.name 
		println params.age 
		println otherParams
	}
}

 

 

 

 然后我们按照下面的方式来进行调用:

 

 

class TestMain { 
	static main(args) { 
		def p =new Person([name:'yezi',age:25]) 
		p.printlnSth name:"tianzi", "i am other params", age:25 
		p.printlnSth "i am other params", age:25,name:"tianzi"
	}
} 

 

 

//输出:

tianzi

25

i am other params tianzi

25

i am other params

 

从上可以看到,如果一个方法传入的参数包含named parameter的话,那么groovy就会自动收集传入的所有named parameter, 然后当作该方法的第一个参数传进去,而不理会named paramter的位置。 但是我们同时也注意到,在定义printlnSth方法的时候,我们都是没有指定参数的类型的(都通过def指定),如果我们直接显式指定printlnSth的第一个参数的类型呢? 比如说指定为map, 如:

 

 

class Person { 
	String name 
	int age 
	void printlnSth(Map params, def otherParams) { 
		println params.name 
		println params.age 
		println otherParams
	}
}

 

 

 

  然后运行TestMain, 发现结果是一样的。

那如果显示指定printlnSth的第一个参数类型为Map之外的类型呢?让我们修改为List后来看看。

 

 

class Person { 
	String name 
	int age 
	void printlnSth(List params, def otherParams) { 
		println params.name 
		println params.age 
		println otherParams
	}
}

 

 

  然后再次运行TestMain, 这个时候groovy提示错误了,

Caught: groovy.lang.MissingMethodException: No signature of method: com.yezi.test.Person.printlnSth() is applicable for argument types: (java.util.LinkedHashMap, java.lang.String) values: [[name:tianzi, age:25], i am other params]

 

从这个错误信息我们可以推断中,如果一个方法,它的传入参数含有named parameter的话,那么groovy就会自动去寻找第一个参数为map的方法来执行(可能方法有重载)。

 

那么第二种用法一般做什么用呢, 一般是应用于DSL的编写中,假设我们要实现一个方法, 用来表示从哪里开车多少公里到哪里, 那么一般我们会这么定义方法:

 

 

class TestMain { 
	static main(args) { 
		drive(10,"1130 kifer rd","sfo")
	}
	
	static void drive(miles,origin,destination) {
		println "drive ${miles} miles from ${origin} to ${destination}"
	}
} 

 

但是这样对于不是程序员的业务人员来说是不直观的。但是如果我们定义成下面这样的话:

 

 

class TestMain { 
	static main(args) { 
		drive(10,from:"1130 kifer rd",to:"sfo")
	}
	
	
	static void drive(addrInfo,miles) {
		println "drive ${miles} miles from ${addrInfo.from} to ${addrInfo.to}"
	}
} 

 

这样的话,对于业务人员来讲,他也可以写,同时方法调用会显得更加清晰。

分享到:
评论

相关推荐

    apache-groovy-3.0.8.zip apache官网的groovy3.0.8版本

    apache-groovy-3.0.8.zip apache官网的groovy3.0.8版本,希望大家多多下载,apache-groovy-3.0.8.zip apache官网的groovy3.0.8版本,希望大家多多下载,apache-groovy-3.0.8.zip apache官网的groovy3.0.8版本,希望...

    Java调用Groovy,实时动态加载数据库groovy脚本

    1. 引入Groovy库:在Java项目中添加Groovy的相关依赖,通常是`groovy-all`,确保Java能够访问Groovy运行时环境。 2. 创建GroovyClassLoader:使用这个类加载器可以动态加载和执行Groovy脚本。它继承自Java的...

    groovy-2.3.6-installer

    Groovy是一种动态、开源的编程语言,它是Java平台上的一个JVM(Java Virtual Machine)语言。Groovy结合了Python、Ruby和Perl等脚本语言的简洁性和灵活性,并且完全兼容Java,可以无缝地与Java代码集成。在"groovy-...

    groovy入门经典,groovyeclipse 插件

    Groovy是一种动态、灵活的编程语言,它是Java平台上的一个扩展,可以无缝集成到Java项目中。Groovy的语法简洁,支持面向对象编程、函数式编程,并提供了许多现代语言特性,如闭包和动态类型。这使得Groovy成为快速...

    Groovy Script 入门

    ### Groovy Script 入门知识点详解 #### 一、Groovy脚本简介 Groovy是一种灵活的面向对象的编程语言,它运行在Java平台上。由于其语法简洁且与Java高度兼容,因此对于Java开发者来说非常容易上手。Groovy不仅支持...

    Groovy入门教程[参照].pdf

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

    groovy和Java相互调用1

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

    groovy-3.0.7.msi

    groovy

    groovy-all

    Groovy是一种动态、开源的编程语言,它是Java平台上的一个重要的补充。Groovy结合了Python、Ruby和Smalltalk等语言的特性,同时保留了与Java的无缝集成能力,使得它在脚本编写、Web开发、自动化测试等领域有着广泛的...

    groovy-sdk-4.0.3

    Groovy SDK 4.0.3 是一个针对Groovy编程语言的软件开发工具包,它包含了Groovy语言的运行环境和开发所需的各种组件。Groovy是一种动态、灵活的面向对象编程语言,它与Java语法兼容,但提供了更简洁的语法和更强的...

    eclipse安装groovy插件的步骤

    ### Eclipse 安装 Groovy 插件的详细步骤与使用指南 #### 一、Groovy 插件的安装 为了能够在 Eclipse 中使用 Groovy 进行开发,首先需要安装 Groovy 插件。以下是详细的安装步骤: 1. **下载 GroovyEclipse.zip ...

    apache-groovy-sdk-4.0.1下载

    Apache Groovy SDK 4.0.1 是一个重要的软件开发工具包,专为使用Groovy编程语言进行开发的程序员设计。Groovy是一种基于Java平台的动态、灵活的编程语言,它扩展了Java语言的功能,提供了简洁的语法和强大的元编程...

    groovy

    Groovy是一种基于Java平台的、动态的、强大的编程语言,它设计的目标是增强开发者的生产力。Groovy结合了Java的静态类型系统和Python、Ruby等动态语言的灵活性,使得开发者可以更加高效地编写代码。本篇文章将深入...

    groovy in action 中文版 2017.11

    Groovy是一种运行在Java虚拟机上的敏捷开发语言,它提供了与Java无缝集成的能力,同时为开发者带来更加简洁和富有表达性的语法。Groovy提供了大量的动态特性,比如动态类型、闭包、元编程能力等,使得编写脚本或应用...

    groovy-3.0.9-API文档-中文版.zip

    赠送jar包:groovy-3.0.9.jar; 赠送原API文档:groovy-3.0.9-javadoc.jar; 赠送源代码:groovy-3.0.9-sources.jar; 赠送Maven依赖信息文件:groovy-3.0.9.pom; 包含翻译后的API文档:groovy-3.0.9-javadoc-API...

    groovy-all-2.4.8.jar

    Groovy是一种动态、开源的编程语言,它是Java平台上的一个重要的补充。Groovy All-2.4.8.jar 是一个包含Groovy库的集合包,主要用于简化Groovy环境的搭建和使用。这个版本(2.4.8)是Groovy在2.x系列中的一个稳定...

    groovy速查手册

    ### Groovy速查手册知识点详解 #### 一、Groovy简介与特性 Groovy是一种为Java虚拟机(JVM)设计的动态语言。它具备完全的对象导向性、可选的类型系统、操作符定制能力、简洁的数据类型声明、闭包(Closures)、...

    Groovy轻松入门—搭建Groovy开发环境

    Groovy是一种基于Java平台的动态、灵活的编程语言,它扩展了Java的语法,提供了更加简洁和易读的代码编写方式。在Groovy中,你可以享受到脚本语言的便利,同时利用Java的强大生态系统。本文将深入探讨如何轻松入门...

Global site tag (gtag.js) - Google Analytics