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'
,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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。