Groovy的JavaBean

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值