Groovy和java是什么关系呢?人们都说Groovy和java很像,究竟哪里很像?人们都说Groovy相对于java更加的简洁,语言表达力更强,又何以见得呢?
首先我想从以下三个方面来阐释我所理解的Groovy相对于java更强的语言表现力。从易到难排序:
第一:GString
java中的string以及Groovy中的普通String都是java.lang.String的实例;而GString则是groovy.lang.GString的实例。
从外形来看,Groovy中的普通字符串用单引号括起;而GString则使用双引号。
那么为什么要引入GString呢,他又能带来普通字符串所不具有的那些特性呢?
GString中允许存在占位符并且可以在运行时对其进行替换。
比如:
def name = ‘Garfield‘
def sampleGString = "My name is $name"
那么引入这种GString有什么具体的好处呢?
1)打印消息的时候不用再使用String.format了;
2)Groovy中的方法名可以用String命名,使用String命名方法一方面增强了方法的可读性,另一方面GString使得方法的动态调用成为可能。
╮(╯▽╰)╭,知道自己没能解释清楚,给个例子:
void setField(String type, String value) {
"add $type"(value)
}def ‘add name‘(String value) {
//some code
}def ‘add hobby‘(String value) {
//some code
}
如果用java就要写成这样了:
void setField(String type, String value) {
if(type == ‘name‘) {
addName(value)
} else if (type == ‘hobby‘) {
addHobby(value)
}
}
第二、Closure(闭包)
闭包对于java来讲是新的概念,但其本身确实不是一个新概念了。
在面向对象的世界里,Closure也可以看做一个对象,只是普通的对象有属性,有行为;而closure就是只有行为没有属性的对象了。
简单来说,closure就是一个用花括号括起来的代码块。
但由于上面讲的,我们完全可以讲closure当做一个对象。
可以声明,定义一个closure,也可以把closure当做参数传递给方法使用。
def sampleClosure = { println"hello!"}
sampleClosure()
在一个closure的内部,包括参数与语句两部分,通常长这样:
{parameter list-> some statements}
如果closure只有一个参数,则可以参数隐式的参数it
Closure envelope = { person -> new Letter(person).send() }
addressBook.each (envelope)
那么相对于java,Groovy提供的closure有什么好处呢?
那就是我们可以不必再使用匿名内部类了!
java中,如果想传递一个代码块给某个方法,则必须定义一个类,使其提供执行该动作的方法,并且将这个类的实例传递给那个方法。这样做的缺点:一方面是不必要的增加了定义类的个数;另一方面是读起来不好懂。
第三、比较小的一个点是Groovy对于属性的处理
首先Groovy会自动而且隐式的为类中定义的field生成setter和getter方法,并且提供了调用该setter、getter方法的快捷方式。
比如:
class Class {
def field;
}
在其他类中,Class object = new Class(); object.field = someValue; def var =
object.field;
可以看到在Class中定义了一个field,由此不必自己定义getter和setter方法;
在其他类中使用上述类的实例时,看起来可以直接访问该field,但实际上是调用了getter setter 的快捷方式。
读书-Groovy in action