在大多数情况下,Java确实需要最终的关键字吗?

时间:2013-03-25 14:05:16

标签: java jvm

我发现有些Java IDE有这个规则,即使不询问用户也能做到最终。例如,只需打开一个缺少任何“最终”文件的文件。关键字,IDE会在其中插入一堆关键字,特别是变量。

我的论点一直是:"如果IDE可以通过算法实现,那么JVM"

这个论点是否有水? Java开发人员什么时候应该使用' final'关键词?是否应该以最终方式声明每个变量?

谢谢!

4 个答案:

答案 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);
}