protectedvoidonScrollChanged(intl, intt, intoldl, intoldt) {
mBackgroundSizeChanged =true;
finalAttachInfo ai =mAttachInfo;
if(ai !=null) {
ai.mViewScrollChanged =true;
}
}
在Android的源码中很多地方对final关键字的用法很是“别出心裁”,之所以这么说是因为我从没看过是这么使用final关键字的,一个典型的例子是View类中onScrollChanged方法(不妨将其成为方案一):
看到了吗?此处mAttachInfo是View类的一个成员变量,而在这个方法中Android的程序员并没有直接操作mAttachInfo变量,而是先赋值给一个标明为final的局部变量ai,然后再操作这个ai。
这个写法我很是想不通,这不是多此一举吗?但是仔细想想又觉得没这么简单,身经百战的Android开发小组这么写应该不会是空穴来风,难道这种写法真的有其他的目的?
第一步:将全局变量赋给一个局部变量:
只是为了取得 在程序运行过程中,该全局变量的当前时刻的值!
但这样是不够的!因为设置 变量local=global,在JAVA里只是将局部的一个引用指向这个全局变量,当全局变量发生改变时,引用它的这个局部变量值会随之改变,倘若局部变量在这个局部代码块里正在运行,又中途被改变了,这会发生多么严重的错误!
第二部:在局部变量前添加final:
这样的话,在该局部代码块中,就不能以任何方式去更改这个引用变量的值了,这样,下面代码的运行安全就有了保障!但在其他代码块里,仍然可以有其他语句去更改那个全局变量的值!
总结:
这段小插曲的作用,其实就是对全局变量取一次样,就像在特定时刻取一次样品,来做实验一样,来做一些事情。取得的样品当然不希望中途变质,要让它final,才能正常使用。而全局变量就任由他继续变化去吧。。。。。。