Groovy的JavaBean

来源:互联网 发布:java前后端分离 vue 编辑:程序博客网 时间:2024/06/05 03:18

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 = 25println "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