32

可能重复:
什么时候应该使用final?

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

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

4

8 回答 8

15

“Java 方式”本质上是杂乱无章的。

我说这是一种很好的做法,但我没有遵循。

测试通常可以确保我在做我想做的事,这对我的审美来说太混乱了。

于 2012-05-21T18:27:15.687 回答
13

我经常final在我的代码中应用局部变量,并且在首先用关键字标记所有有效的最终变量后发现阅读代码更容易。我认为这是对代码的真正增强,并在此后立即提交。final

至于代码混乱的问题,当应用于局部变量时,我认为它没有破坏性——事实上,由于语法着色,它使我更容易发现所有声明。

不过,我必须承认,当用于参数、catch 块、增强的 for 循环和除狭义的局部变量之外的所有其他地方时,我确实发现它非常混乱。final这是非常不幸的,因为在这些情况下重新分配更加令人困惑,并且默认情况下它们确实应该是最终的。

于 2012-05-21T18:32:29.090 回答
12

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

于 2012-05-21T18:23:13.647 回答
4

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

我强烈反对它会造成“代码混乱”;这是语言的一个好的和强大的方面。

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

于 2012-05-21T18:27:18.903 回答
3

它肯定会为您提供更好的代码,很容易看出哪些变量将被更改。

它还通知编译器它不会改变,这可能会导致更好的优化。

除此之外,如果您倾向于犯任何错误,它还允许您的 IDE 向您提供编译时间通知。

于 2012-05-21T18:24:51.743 回答
2

一些好的分析工具,比如 PMD,建议final除非必要,否则总是放。因此,该工具中的约定说这是一个好习惯

但我认为代码中如此多的最终标记可能会使它对人类不那么友好。

于 2012-05-21T18:23:04.147 回答
1

我会说是的,不是为了编译器优化,而是为了可读性。

但我个人不使用它。Java 本身就非常冗长,如果我们遵循所有被认为是“好的做法”,那么代码将无法从所有样板中删除。不过,这是一个偏好问题。

于 2012-05-21T18:30:37.467 回答
0

优缺点都总结的差不多了。。。

我可以添加另一个骗局:

代码的读者根本不需要推理最终变量的值(除了罕见的错误代码情况)。

所以,是的,这是一个很好的做法。

在你习惯了它之后,混乱并没有那么糟糕(比如 unix :-P)。另外,典型的 IDE 会自动为您执行此操作...

于 2012-05-21T18:26:02.510 回答