除非必要,否则我倾向于声明所有变量final
。我认为这是一个很好的做法,因为它允许编译器检查标识符是否按预期使用(例如,它没有变异)。另一方面,它使代码混乱,也许这不是“Java方式”。
我想知道是否存在关于非必要使用最终变量的普遍接受的最佳做法,以及是否应该让这个讨论有其他权衡或方面。
答案 0 :(得分:14)
“Java方式”本身就是一种内在的混乱。
我说这是一个很好的做法,但不是我遵循的做法。
测试通常可以确保我按照自己的意愿行事,而且对于我的美学来说,它也是太。“
答案 1 :(得分:12)
我认为这是一个很好的做法,对于维护程序员(包括我!)而言比编译器更多。如果我不需要担心哪个变量可能会在其中发生变化,那么考虑一个方法会更容易。
答案 2 :(得分:10)
我经常将final
应用于我的代码中的局部变量,并且在首次使用{{标记所有效率最终变量后,更容易找到读取代码1}}关键字。我认为这是对代码的真正增强,并在此后立即提交。
至于代码杂乱的问题,当应用于局部变量时,我发现它不具有破坏性 - 实际上它使我更容易因语法着色而发现所有声明。
但是,我必须承认,当final
用于参数,catch块,增强型for循环以及除局部变量之外的所有其他位置时,我做会发现它难以忍受地混乱。狭义。这是非常不幸的,因为在这些情况下的重新分配更加令人困惑,而且默认情况下它们应该是最终的。
答案 3 :(得分:5)
是的,这是一个非常好的主意,因为它清楚地显示了在对象构造中必须提供哪些字段。
我强烈反对它造成“代码混乱”;它是语言的一个优秀而强大的方面。
作为一个设计原则,如果可以的话,你应该制作你的课程immutable(所有最后的字段),因为它们可以安全地发布(即自由传递而不用担心它们会被破坏)。虽然注意字段本身也需要是不可变对象。
答案 4 :(得分:3)
它肯定会为您提供更好的代码,很容易看出所有变量都将被更改。
它还通知编译器它不会改变哪个可以导致更好的优化。
如果您倾向于犯任何错误,它允许您的IDE为您提供编译时通知。
答案 5 :(得分:0)
一些好的分析工具,比如PMD,除非必要,否则总是提出final
的建议。因此,该工具的惯例表明它是一种很好的做法
但我认为代码中的这么多最终代币可能会降低人性化。
答案 6 :(得分:0)
你几乎总结了利弊......
我可以添加另一个骗局:
代码的读者根本不需要推理最终变量的值(罕见的坏代码情况除外)。
所以,是的,这是一个很好的做法。
在你习惯它之后,杂乱并不是那么糟糕(比如unix :-P)。此外,典型的IDE会自动为您做...
答案 7 :(得分:0)
我会说是,不是为了编译器优化,而是为了可读性。
但我个人不使用它。 Java本身就很冗长,如果我们遵循所有被认为是“良好实践”的东西,代码将无法从所有样板中获得。不过,这是一个偏好的问题。