在可能的情况下声明变量"final"是一个好习惯吗?

Lan*_*uhn 30 java final

可能重复:
何时应该使用final?

final除非必要,否则我倾向于声明所有变量.我认为这是一个很好的做法,因为它允许编译器检查标识符是否按预期使用(例如,它没有变异).另一方面,它使代码混乱,也许这不是"Java方式".

我想知道是否存在关于最终变量的非必要使用的普遍接受的最佳实践,以及是否应该了解该讨论的其他权衡或方面.

Dav*_*ton 14

"Java方式"本身就是一种内在的混乱.

我说这是一个很好的做法,但不是我遵循的.

测试通常可以确保我按照我的意图行事,而且对我的美学来说太过于杂乱.

  • 这准确地概括了我对此的感受。我只在静态字符串中使用final。由于 Java 按值传递对象(与 C 不同),因此使用 Final 也只会造成混乱。最后,你要么知道自己在做什么,要么不知道。我从来没有遇到过可以通过使用 Final 来避免的错误......从来没有! (2认同)

Car*_*ter 12

我认为这是一个很好的实践,更多的是维护程序员(包括我!)而不是编译器.如果我不需要担心哪些变量可能在其中发生变化,那么考虑一个方法会更容易.

  • 人们知道变量不会被重新分配,但它仍然很可能是可变的!最终引用并不能保证值不可变,因此它对于让您知道变量值是否会更改有多大帮助是有争议的。“AtomicReference”和“List”就是很好的例子,虽然引用可能是最终的,但内容肯定可以改变。 (2认同)

Mar*_*nik 11

我经常final在我的代码中应用局部变量,并且在首次使用关键字标记所有有效的最终变量之后,还更容易找到读取代码.我认为这是对代码的真正增强,并在此之后提交.final

至于代码杂乱的问题,当应用于局部变量时,我发现它不具有破坏性 - 事实上它使我更容易发现所有声明,因为语法着色.

但是,我必须承认,当我在参数,catch块,增强for循环以及除狭义上的局部变量之外的所有其他地方使用时,我确实发现它难以忍受final.这是非常不幸的,因为在这些情况下的重新分配更加令人困惑,它们应该在默认情况下确实是最终的.


Boh*_*ian 5

是的,这是一个非常好的主意,因为它清楚地显示了在对象构造中必须提供哪些字段.

我强烈反对它造成"代码混乱"; 它是语言的一个优秀而强大的方面.

作为一个设计原则,如果可以的话,你应该让你的类不可变(所有最终字段),因为它们可以被安全地发布(即自由传递而不用担心它们会被破坏).虽然注意字段本身也需要是不可变对象.

  • 这适用于类字段,OP 正在谈论方法内的变量。 (3认同)

ric*_*nal 2

一些好的分析工具,如 PMD,建议除非必要,否则应始终使用final。所以该工具中的约定表明这是一个很好的实践

但我认为代码中如此多的最终标记可能会使其不太人性化。