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