Groovy Tip 8 GroovyBean
做这个主题的时候,我曾想了好些天,要不要做这个主题。因为Groovy Bean对于使用Groovy语言的开发者来说再熟悉不过,说不定每天都在用它。犹豫了好多天,才决定把它写下来。因为我也使用Groovy Bean很久了,但很多概念也是慢慢搞清楚的,在写代码的时候走了一些弯路。
肯定很多使用了Groovy语言的开发者写过类似于这样的代码:
class
Person
{
String name
int age
String addr
}
也肯定这样使用过:
Person person =
new
Person()
person.name =
'Tom'
……
很多初次接触
Groovy
语言的人都以为
Groovy Bean
的属性是公开的,可以直接访问。这其实是一个误解。上面的
Person
类其实相当于如下的
Java
类:
public
class
Person {
private
String
name
;
private
int
age
;
private
String
addr
;
public
String getAddr() {
return
addr
;
}
public
void
setAddr(String addr) {
this
.
addr
= addr;
}
public
int
getAge() {
return
age
;
}
public
void
setAge(
int
age) {
this
.
age
= age;
}
public
String getName() {
return
name
;
}
public
void
setName(String name) {
this
.
name
= name;
}
}
因此,上面的
person.name =
'Tom'语句其实相当于Java语言中的:
person.setName(“Tom”);
而println person.name语句相当于Java语言中的:
person.getName();
同样,Groovy语言还有一个一个规则,
如果你声明一个属性为“
private
”、“
public
”或“
protected
”,那么你只是声明了一个属性,这意味着你要自己写属性的“
set
”和“
get
”方法。
Groovy语言对Java语言的Javabean的更外一个简化就是你不需要给Groovy Bean编写一个构造器,就可以使用构造器。如:
Person person =
new
Person(name:
'Tom'
)
println
person.name
当然,你也可以一口气把
Person
类的属性全部赋值:
Person person =
new
Person(name:
'Tom'
,age:
22
,addr:
'Shenzhen'
)
println
"${person.name} lived in ${person.addr}"
打印结果为:
Tom lived in Shenzhen
当你把一个属性声明成
final
的时候,就不能再给该属性赋值了。如:
class
Person {
String name
final
int
age = 22
String addr
}
它相当于
Java
的:
public
class
Person {
private
String
name
;
private
final
int
age
= 22;
private
String
addr
;
public
String getAddr() {
return
addr
;
}
public
void
setAddr(String addr) {
this
.
addr
= addr;
}
public
int
getAge() {
return
age
;
}
public
String getName() {
return
name
;
}
public
void
setName(String name) {
this
.
name
= name;
}
}
注意,只有
getAge
()方法,没有
set
方法。
如果你对上面的
Groovy Bean
进行如下访问:
Person person =
new
Person(name:
'Tom'
,age:
22
,addr:
'Shenzhen'
)
println
"${person.name} lived in ${person.addr}"
就会抛出如下的Exception:
Exception in thread "main"
groovy.lang.ReadOnlyPropertyException
: Cannot set readonly property: age for class: Person