我发现有些Java IDE有这个规则,即使不询问用户也能做到最终。例如,只需打开一个缺少任何“最终”文件的文件。关键字,IDE会在其中插入一堆关键字,特别是变量。
我的论点一直是:"如果IDE可以通过算法实现,那么JVM"
这个论点是否有水? Java开发人员什么时候应该使用' final'关键词?是否应该以最终方式声明每个变量?
谢谢!
答案 0 :(得分:12)
我的论点一直是:"如果IDE可以通过算法实现,那么JVM"
这个论点是否有水?
不。因为当IDE执行它时(我没有看到任何默认而没有询问,即使您可以明确地将其配置为以这种方式执行),开发人员也可以检查它&#真的是他们想要的决定。这个阻止其他代码违背开发人员的意愿。
如果仅在执行时完成,那将失败整个目的。如果我创建一个字段final
以防止其他代码修改它,如果其他代码尝试修改它,我想要一个编译时错误。如果它只是留给JVM,我就不能依赖代码而不是修改它。
Java开发人员何时应该使用' final'关键字?
对于字段,当字段意图在构造函数中初始化时,之后不再更改。
对于课程,当您没有为您的班级设计为子类(IMO)时。
对于方法,当您没有为子类设计代码以覆盖该方法时。
对于局部变量,您要在匿名内部类中访问变量。 (你当然也可以将它们用于其他局部变量 - 我不倾向于,但我知道有些人会这样做。当然,这种差异在方法之外的代码中是不可见的。)
答案 1 :(得分:1)
你太模糊了,最终意味着许多事情:http://en.wikipedia.org/wiki/Final_(Java)
此外,请参阅此相关讨论:https://softwareengineering.stackexchange.com/questions/115690/why-declare-final-variables-inside-methods链接到以下artcle:
http://www.javapractices.com/topic/TopicAction.do?Id=23
使用final关键字来传达您的意图。 final关键字有多个含义:
- 最后一堂课无法延期
- 最终方法无法覆盖
- 最终字段,参数和局部变量无法更改它们 值设置
在最后一种情况下,理解基元的“值” 在通常意义上,对象的“值”意味着对象的 身份,而不是它的状态。一旦最终对象的标识引用 设置后,它仍然可以改变其状态,但不能改变其身份。声明 原始字段作为final自动确保线程安全 字段。
有些人习惯性地将参数声明为final,因为这几乎总是如此 期望的行为。其他人发现这个很冗长,而且不太真实 益处。
始终使用带有局部变量的final(在适当的时候)可以 也很有用。它引起了对非最终本地人的关注 变量,通常有更多与之相关的逻辑(for 例如,结果变量,累加器,循环变量)。很多人发现 这个冗长。一种合理的方法是将final用于本地 仅当至少有一个非最终局部变量时才变量 方法 ;这有助于快速区分非最终本地 来自其他人的变量。
使用final:
- 明确传达您的意图
- 允许编译器和虚拟 机器执行次要优化
- 清楚地标记出的项目 行为更简单 - 最终说,“如果你正在寻找 复杂性,你不会在这里找到它。“
答案 2 :(得分:0)
局部变量只有在final
时才能在内部类中使用。
final
修饰符可用于保护自己免受setter方法中的滑动。
public void setLimit(int limit) {
/*this.*/limit = limit;
}
显然是错的;需要输入this.
。在
final
public void setLimit(final int limit) {
limit = limit;
}
将其转换为编译错误。
答案 3 :(得分:0)
每个可能最终变量的变量都应该这样声明吗?
是
很多人都没有意识到编译器可以做多少来帮助你避免常见的问题:
// Final parameters cannot be reassigned. This sometimes happens accidentally
// and sometimes because people see them as convenient local variables.
publc void myFunction(final int myIntParam) {
// Let's declare a local variable
final String myLocalString;
// ... there's some code here ...
// Here, the compiler knows whether this variable has been assigned
// The programmer knows that it has been assigned only once
return myLocalString.toUpperCase(Locale.ENGLISH);
}