为什么我要在Java中的方法参数上使用关键字“final”?我不明白其中final的关键字是真的方便的时候它是在方法的参数使用。如果我们排除使用匿名类,可读性和意图声明,那么对我来说似乎几乎一文不值。强制某些数据保持不变并不像看起来那么强大。如果参数是基元,那么它将没有任何效果,因为参数作为值传递给方法,并且更改它将在范围之外没有任何影响。如果我们通过引用传递参数,那么引用本身就是一个局部变量,如果从方法中更改引用,那么从方法范围外部不会产生任何影响。考虑下面的简单测试示例。尽管该方法改变了给定的参考值,但该测试仍然通过,但它没有效果。public void testNullify() {
Collection<Integer> c = new ArrayList<Integer>();
nullify(c);
assertNotNull(c);
final Collection<Integer> c1 = c;
assertTrue(c1.equals(c));
change(c);
assertTrue(c1.equals(c));}private void change(Collection<Integer> c) {
c = new ArrayList<Integer>();}public void nullify(Collection<?> t) {
t = null;}
3 回答
阿晨1998
TA贡献2037条经验 获得超6个赞
有时,显式(为了可读性)变量不会改变是很好的。这是一个简单的例子,使用final
可以节省一些可能的麻烦:
public void setTest(String test) { test = test;}
如果您忘记了setter上的'this'关键字,那么您要设置的变量不会被设置。但是,如果您在final
参数上使用了关键字,则会在编译时捕获该错误。
慕码人8056858
TA贡献1803条经验 获得超6个赞
是的,排除匿名类,可读性和意图声明它几乎一文不值。这三件事虽然毫无价值吗?
我个人倾向于不使用final
局部变量和参数,除非我在匿名内部类中使用变量,但我当然可以看到那些想要明确参数值本身不会改变的人的观点(甚至如果它引用的对象改变其内容)。对于那些发现增加可读性的人,我认为这是完全合理的事情。
如果有人真的声称它确实以不支持的方式保持数据不变,那么你的观点将更为重要- 但我不记得看到任何此类声明。你是否建议有大量的开发人员认为final
它比实际效果更好?
编辑:我应该用Monty Python参考总结所有这些; 这个问题看起来有点类似于问“罗马人为我们做过什么?”
添加回答
举报
0/150
提交
取消