论坛首页 入门技术论坛

在循环中临时变量定义成final的意义

浏览 5972 次
该帖已经被评为新手帖
作者 正文
   发表时间:2009-07-06  
OO
循环体内的变量定义成final有什么意义:
for(int i=0;i<INFO_KEYS.length;i++){
  final HSSFCell hsCell=hr.createCell(i);
  hsCell.setCellValue(infoMap.get(INFO_KEYS[i]));
}

比起一般的写法:
HSSFCell hsCell=null;
for(int i=0;i<INFO_KEYS.length;i++){
  hsCell=hr.createCell(i);
  hsCell.setCellValue(infoMap.get(INFO_KEYS[i]));
}


大侠们能不能讲讲!

   发表时间:2009-07-06  
锁定单元格?
0 请登录后投票
   发表时间:2009-07-06  
没意义。有的人就是喜欢用 final。
0 请登录后投票
   发表时间:2009-07-06  
final 用来将变量和变量的初始值(对象)在变量的作用域内永久绑定,
不过在你的这个例子中
没什么意义
0 请登录后投票
   发表时间:2009-07-07  
步行者 写道
final 用来将变量和变量的初始值(对象)在变量的作用域内永久绑定,
不过在你的这个例子中
没什么意义

能不能详细介绍一下,在什么情况下有意义?
我想主要是从内存来说有没有什么意义,占用的内存更多或是更少?
0 请登录后投票
   发表时间:2009-07-07  
iaimstar 写道
锁定单元格?

什么意思?
0 请登录后投票
   发表时间:2009-07-08  
luzl 写道
步行者 写道
final 用来将变量和变量的初始值(对象)在变量的作用域内永久绑定,
不过在你的这个例子中
没什么意义

能不能详细介绍一下,在什么情况下有意义?
我想主要是从内存来说有没有什么意义,占用的内存更多或是更少?

内存?没什么关系。
要说关系的话。final变量地址存储在只读存储器中,对象的引用不可修改,而值还是可以改变的,除非你这个是基本类型或者String
0 请登录后投票
   发表时间:2009-07-08  
final用来修饰变量,意义是什么?
0 请登录后投票
   发表时间:2009-07-08  
star022 写道
final用来修饰变量,意义是什么?

如果变量是引用变量,就是改变量指向的地址不可以修改,但是可以修改指向对象的属性
如果变量是基本变量,就是值不可以修改。
总之final是赋值一次,就不可以修改变量的值,只读的意思。

这里使用final没有任何意义。
0 请登录后投票
   发表时间:2009-07-08  
luzl 写道
循环体内的变量定义成final有什么意义:
for(int i=0;i<INFO_KEYS.length;i++){
  final HSSFCell hsCell=hr.createCell(i);
  hsCell.setCellValue(infoMap.get(INFO_KEYS[i]));
}

比起一般的写法:
HSSFCell hsCell=null;
for(int i=0;i<INFO_KEYS.length;i++){
  hsCell=hr.createCell(i);
  hsCell.setCellValue(infoMap.get(INFO_KEYS[i]));
}


大侠们能不能讲讲!


可能原作者担心别人这么用吧
HSSFCell hsCell=null;
for(int i=0;i<INFO_KEYS.length;i++){
  hsCell=hr.createCell(i);
  hsCell.setCellValue(infoMap.get(INFO_KEYS[i]));
  hsCell=hr.createCell(i); //replace the previous cell
  //Do something unexpected...
}


主要是防止不预期的编码, 如果出现不预期的编码,那么在编译期就会出错。
比如有人这么编码


          @Test
	public void testTaskService(){		
		task.setId(2);
		new TestFinal().doTask(task);
		org.junit.Assert.assertEquals(task.getId(), 2);
		
	}
	
	class TestFinal{
		public void doTask(Task task){
                           //the following is the invalid coding
			task = new Task();
			task.setId(1);
		}
	}



假如在加上final就能防止这种无效编码,比如

         @Test
	public void testTaskService(){		
		task.setId(2);
		new TestFinal().doTask(task);
		org.junit.Assert.assertEquals(task.getId(), 2);
		
	}
	
	class TestFinal{
		public void doTask(final Task task){
                           //You will get an error when you try to get the source code compiled
			task = new Task();
			task.setId(1);
		}
	}



此外还有比较常见的final instance variable, 主要防止在开发过程中,以及维护过程中,某个方法可能把这个variable替换掉,导致非预期结果。

请指正...
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics