这个“s”真的有效吗?

时间:2016-02-11 22:32:03

标签: java

这是一些示例代码(假设Java 8)。

while (true){
    Socket s = serverSocket.accept();
    // some code here ... we don't assign anything to s again here ... 
}

s在循环中是否有效最终?

1 个答案:

答案 0 :(得分:5)

假设s未在其声明之前分配,那么是,s是“有效最终”,根据JLS, Section 4.12.4定义它,在您的情况下:< / p>

  

某些未声明为final的变量被认为是有效的最终

     
      
  • 如果满足以下所有条件,则声明符具有初始值设定项(第14.4.2节)的局部变量实际为

         
        
    • 未声明final

    •   
    • 它永远不会出现在赋值表达式(第15.26节)的左侧。 (请注意,包含初始值设定项的局部变量声明符是赋值表达式。)

    •   
    • 它永远不会作为前缀或后缀增量或减量运算符的操作数出现(§15.14,§15.15)。

    •   
  •   
  • 如果满足以下所有条件,则声明者缺少初始值设定项的局部变量实际上是最终的:

         
        
    • 未宣布为最终版。

    •   
    • 每当它在赋值表达式中作为左侧出现时,它肯定是未赋值的,并且在赋值之前没有明确赋值;也就是说,它绝对是未赋值的,并且在赋值表达式的右侧(§16(Definite Assignment))之后没有明确赋值。

    •   
    • 它永远不会作为前缀或后缀的操作数增加或减少运算符。

    •   
  •   

您只在声明时指定s,并且作为对象,它不能是递增或递减运算符的操作数,因此它实际上是最终的。

它还声明变量在另一种情况下可以是有效的最终,如果它在声明时没有被赋值,只要它只分配一次,它肯定不会在声明之前分配,并且它在声明后明确赋值。

此外,在该部分的末尾,它指出:

  

如果变量有效final,则将final修饰符添加到其声明中不会引入任何编译时错误。相反,如果删除final修饰符,则在有效程序中声明为final的局部变量或参数将成为最终的。

您应该能够在不引起编译器错误的情况下明确final。如果是这样,它实际上是最终的。