需要将方法参数标记为final
以允许内部匿名类进行变量访问,并且是一种有用的编码工具,用于在方法中强制执行某些变量使用约定。
除此之外,使用final
- 关键字是否存在其他与编译相关的动机?具体来说,它是否为编译器提供了哪些提示,这些提示有助于某些特定的优化,否则将无法执行?或者编译器是否足够智能以始终识别变量是否永远不会被修改?
例如,我在想如何将变量传递给方法有什么不同。例如。传递给方法时需要复制基本类型的变量(int,byte等)以防止任何修改进入调用代码,而如果参数标记为final
,则可能是“通过引用传递“没有这样的顾虑,即不需要复制操作。
但是让我们保持这个问题比这个例子更通用:
是否存在向方法参数添加final
会更改生成的字节代码的情况?
答案 0 :(得分:1)
不,没有。这纯粹是编译时检查。
请注意,字节码比您想象的更高级别 - 特别是没有原始内存地址。所有参数传递都被抽象掉了。此外,Java编译器进行的优化很少。 JIT负责在运行时进行所有优化。
此外,在实际的机器代码级别,通过引用传递单个单词参数可能不会优化任何内容。在正常情况下,复制它会更快(因为它无论如何都在寄存器中)。但同样,这是JIT担心的所有低级实现细节,而不是字节码的范围。