我是先有的Java基础,再学习Flex里的ActionScript的,最初写VO的时候,根本就没有想什么,直接将JavaBean"翻译"成VO。
JavaBean:
public class MyJavaBean implements Serializable, Cloneable {
private String str;
public String getStr() {
return str;
}
public void setStr(String str) {
this.str = str;
}
}
翻译成AS后:
[Bindable]
[RemoteClass(alias="MyJavaBean")]
[Bindable]
public class MyVO{
private var str:String;
public function getStr():String {
return str;
}
public function setStr(str:String):void {
this.str = str;
}
}
使用起来一切正常。
但是,在一些书上的代码中都可以看到类似
这样的代码,开始不太明白这个"get"是怎么回事,是不是印刷的不好,怎么后面有个空格呢?后来,看到很多网上代码也是如此,才特意去找了些资料。
于是才得知AS里本是这样写getter/setter的
[RemoteClass(alias="MyJavaBean")]
[Bindable]
public class MyVO{
private var _str:String;
public function get str():String {
return _str;
}
public function set str(str:String):void {
_str = str;
}
}
由于有了get和set这两个关键字,似乎AS这次支持不同参数的同名函数重载了。
当然,之前我想当然的哪种类似Java的写法也是可以的。不过这两种方式的使用方法可是不同的。第二种方式,在使用的过程中是直接点取属性使用的,就好像这个类中存在一个public的str属性一样:
这样一来,和直接写成
还有什么分别呢?(指的是方法中只是直接取值、赋值,没有更多运算的大多数情况下)
更让我不可思议的是,在一篇课程中居然还写了,Java1.7开始也要变成这样的getter/setter方式了! 我的天呀!!
直到一天,研究绑定的时候,我希望将画面的控件与VO中的属性绑定。
当由控件取值给VO时,可以写成
但由VO取值给控件赋值时,却怎么也写不出来了,没有bindGetter方法,bindProperty似乎又不好用。明明在函数说明中写着第4个参数可以是getter方法,但死活不灵。
突然,我意识到了两种getter的写法,如果改用后者,那么自然轻松搞定,因为它用起来本身就好似是public的属性吗。于是才意识到原来类Java写法虽然也兼容(因为他本来就是一种普通的函数的写法),但至少在这里会遇到问题。改吧!那和public属性比起来又有何分别呢?(我这里都是单纯的取值/赋值操作,没有计算)
后来,终于在一篇讲述BlazeDS的文章中得知,VO的属性用public的,比用getter/setter的速度(与Java通信的速度)要快些,再加之官方的各种例子里都是直接写成public,至此我决定干脆2种getter/setter方法都不用了,VO的属性统统public。