JaveBean
以下是java中构建一个javaBean的代码:
public class Car {
public int miles;
private final int year;
public int getMiles() {
return miles;
}
public int getYear() {
return year;
}
public void setMiles(int miles) {
this.miles = miles;
}
public Car(int theYear){
year = theYear;
}
public static void main(String[] args){
Car car = new Car(2008);
System.out.println("Year:" + car.getYear());
System.out.println("Miles:" + car.getMiles());
System.out.println("Setting miles");
car.setMiles(25);
System.out.println("Miles:" + car.getMiles());
}
}
运行结果为:
Year:2008
Miles:0
Setting miles
Miles:25
用Groovy写,则可以省略很多代码
class Car {
def miles = 0
final year
Car(theYear){
year = theYear
}
}
Car car = new Car(2008)
println "Year: $car.year"
println "Miles: $car.miles"
println "Setting miles"
car.miles = 25
println "Miles: $car.miles"
运行结果:
Year: 2008
Miles: 0
Setting miles
Miles: 25
def在这个上下文中声明了一个属性,我们可以用def声明属性,也可以用int miles或者int miles=0这样给出类型。Groovy会在背后默默为期创建一个访问器和一个更改器。当代码中调用miles时候,其实并非引用一个字段,而是调用该属性的访问器。要把属性设置为只读,需要使用final来声明该属,这和java一样。在这种情况下,Groovy会为该属性提供一个访问器,但不提供更改器。修改final字段的任何尝试都会导致异常。可以根据需要向声明中加入类型信息。可以把字段标记为private,但是Groovy并不会遵守这一点。因此,如果想把变量设置为私有的,必须实现一个拒绝任何修改的更改器。可以通过下面的代码验证这一概念。
class Car {
private miles = 0
final year
Car(theYear){
year = theYear
}
def getMiles(){
println "getMiles called"
miles
}
private void setMiles(miles){
throw new IllegalAccessException("you're not allowed to change miles")
}
def drive(dist){
if(dist>0){
miles += dist
}
}
}
def car = new Car(2012)
println "Year: $car.year"
println "Miles: $car.miles"
println "Driving"
car.drive(10)
println "Miles: $car.miles"
try{
print "Can I set the year?"
car.year = 1900
}catch (ReadOnlyPropertyException ex){
println ex.message
}
try{
println "Can I set the miles?"
car.miles = 12
}catch (IllegalAccessException ex){
println ex.message
}
这里使用final声明了year,使用private声明了miles。在drive()实例方法中,无法修改year,但是可以修改miles。miles的更改器不允许在类的外部对该属性的值进行任何修改
输出的结果为:
Year: 2012
getMiles called
Miles: 0
Driving
getMiles called
Miles: 10
Can I set the year?Cannot set readonly property: year for class: groovy.Car
Can I set the miles?
you’re not allowed to change miles
从结果可以看出,我们能够读取两个属性的值,但是不能设置其中任何一个
想要存取属性,再也不需要在调用中使用访问器和更改器了。下面代码说明了其优雅:
Calendar.instance
//代替Calendar.getInstance()
str = 'hello'
println str.class.name
//代替str.getClass().getName()
//注意:不能用于Map,Builder等类型
//为保险起见,请使用str.getClass().name