当前位置:  开发笔记 > 编程语言 > 正文

为什么在Java中将局部变量和方法参数标记为"final"?

如何解决《为什么在Java中将局部变量和方法参数标记为"final"?》经验,为你挑选了5个好方法。

在Java中,您可以使用final关键字限定局部变量和方法参数.

public static void foo(final int x) {
  final String qwerty = "bar"; 
}

这样做会导致无法在方法体中重新分配x和qwerty.

这种做法使你的代码向不变性的方向推动,这通常被认为是一个加分.但是,它也会使代码混乱,"最终"出现在各处.您对Java中的局部变量和方法参数的final关键字有何看法?



1> rjray..:

只要合适,你应该尝试这样做.除了在"意外"尝试修改值时发出警告,它还为编译器提供了可以更好地优化类文件的信息.这是Robert Simmons,Jr.的书中的"Hardcore Java"中的一点.实际上,本书花了所有第二章关于final的使用来促进优化和防止逻辑错误.出于这个原因,诸如PMD和Eclipse的内置SA之类的静态分析工具标记了这些类型的情况.


+1:只需添加一个 - "final"也可以传达作者的_intent_,包括参数和局部变量.
说明PMD不在自己的源代码中使用最终方法参数,举个例子.我看过的大多数JDK也没有.Eclipse的重构也没有,比如封装.
我现在正在阅读Hardcore Java.我以为我认识java ...........
您确定最终的locals /方法参数可以使编译器更好地进行优化吗?对于一个反点,想象一下你是否声明了一个局部变量`int x = 2`.如果你无条件**永远不会重新分配`x`,编译器**将会知道这一点,因为通过扫描整个代码体并看到`x`无论在什么条件下都不可能被重新分配,它会推断出`x `永远不会被修改......

2> SCdF..:

我个人认为这是浪费时间.我相信视觉上的混乱和额外的冗长是不值得的.

我从来没有遇到过我重新分配的情况(请记住,这不会使对象成为不可变的,这意味着你无法重新分配另一个对变量的引用)一个错误的变量.

但是,当然,这都是个人偏好;-)


+1因为我认为它不仅仅是关于方法体和逻辑错误(我从来没有因为非最终变量,FWIW而运行),而且还关于可读方法签名.我无法看到声明为final的参数如何使签名更具可读性.简单类型由值传递,因此不可修改.复杂类型通过引用传递,但引用按值传递,因此不可修改.最终只是签名读者的噪音.

3> Thorbjørn Ra..:

最后制作一个参数可以保证方法中任何位置使用的值都是指传递的值.否则,您必须在心理上解析给定位置上方的所有代码,以了解参数在该点的值.

因此,使用final会使您的代码本身不易读取和维护:)

最终的局部变量取决于意图,在我看来并不重要.取决于发生了什么.



4> Uri..:

在局部变量的情况下,我倾向于避免这种情况.它会导致视觉混乱,并且通常是不必要的 - 一个功能应该足够短或专注于一次冲击,让你快速看到你修改了一些不应该的东西.

在魔术数字的情况下,我会将它们作为一个常量私有字段而不是代码中.

我只在有必要的情况下使用final(例如,将值传递给匿名类).



5> javamonkey79..:

由于Java的"偶然参与" 传递行为(偶尔)令人困惑,我绝对同意最终确定参数var.

最终确定局部变量似乎有点过分了IMO.

推荐阅读
mobiledu2402851173
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有