Java之Final

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,才能正常使用。而全局变量就任由他继续变化去吧。。。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值