为了账号安全,请及时绑定邮箱和手机立即绑定

为什么我要在Java中的方法参数上使用关键字“final”?

为什么我要在Java中的方法参数上使用关键字“final”?

浮云间 2019-07-23 16:20:49
为什么我要在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参数上使用了关键字,则会在编译时捕获该错误。


查看完整回答
反对 回复 2019-07-23
?
慕码人8056858

TA贡献1803条经验 获得超6个赞

是的,排除匿名类,可读性和意图声明它几乎一文不值。这三件事虽然毫无价值吗?

我个人倾向于不使用final局部变量和参数,除非我在匿名内部类中使用变量,但我当然可以看到那些想要明确参数值本身不会改变的人的观点(甚至如果它引用的对象改变其内容)。对于那些发现增加可读性的人,我认为这是完全合理的事情。

如果有人真的声称它确实以不支持的方式保持数据不变,那么你的观点将更为重要- 但我不记得看到任何此类声明。你是否建议有大量的开发人员认为final它比实际效果更好?

编辑:我应该用Monty Python参考总结所有这些; 这个问题看起来有点类似于问“罗马人为我们做过什么?”


查看完整回答
反对 回复 2019-07-23
  • 3 回答
  • 0 关注
  • 1171 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信