Java 这是不是;s";最终结果?

Java 这是不是;s";最终结果?,java,Java,下面是一些示例代码(假设为Java8) s在循环中是否有效地是最终的 假设s的赋值没有超过其声明,那么根据定义它的,是的,s是“有效的最终值”,在您的情况下: 某些未声明为最终变量的变量实际上被视为最终变量: 如果以下所有条件均为真,则声明器具有初始值设定项(§14.4.2)的局部变量实际上是最终变量: 它未声明为最终版 在赋值表达式中,它从不作为左手边出现(§15.26)。(请注意,包含初始值设定项的局部变量声明符不是赋值表达式。) 它从不作为前缀或后缀递增或递减运算符(§15.14,

下面是一些示例代码(假设为Java8)


s
在循环中是否有效地是最终的

假设
s
的赋值没有超过其声明,那么根据定义它的,是的,
s
是“有效的最终值”,在您的情况下:

某些未声明为最终变量的变量实际上被视为最终变量:

  • 如果以下所有条件均为真,则声明器具有初始值设定项(§14.4.2)的局部变量实际上是最终变量:

    • 它未声明为
      最终版

    • 在赋值表达式中,它从不作为左手边出现(§15.26)。(请注意,包含初始值设定项的局部变量声明符不是赋值表达式。)

    • 它从不作为前缀或后缀递增或递减运算符(§15.14,§15.15)的操作数出现

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

    • 这不是最终决定

    • 当它出现在赋值表达式中的左侧时,它肯定是未赋值的,并且在赋值之前不一定赋值;也就是说,它肯定是未赋值的,并且在赋值表达式的右侧(§16(明确赋值))之后不是明确赋值的

    • 它从不作为前缀或后缀递增或递减运算符的操作数出现

只能在声明时赋值
s
,作为一个对象,它不能是递增或递减运算符的操作数,因此它实际上是最终的

它还指出,在另一种情况下,一个变量可以是有效的最终变量,如果它在声明时没有赋值,只要它只赋值一次,它肯定不会在声明之前赋值,肯定会在声明之后赋值

此外,在该节末尾,它指出:

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


您应该能够显式地将其设置为
final
,而不会导致编译器错误。如果是这样的话,它实际上是最终的。

我不这么做。假设我不这样做,我会问“有效的最终结果”。@cricket_007:如果你从来没有这样做过,那么
s
仍然是有效的最终结果。@peter.petrov:这让我有点痛苦,但这个重复回答了你的问题。在Java8中,这是有效的;在Java7和更早版本中,这是一个更具争议性的问题。@Reimeus:“有效最终”一词是否适用于Java7?@cricket_007,除非我弄错了,它基本上是Java8的东西。这与lambda何时可以引用外部变量有关。您引用的两个部分似乎在
inti;i=3。前者似乎认为
i
不是有效的final(因为它的声明器没有初始值设定项,它确实出现在赋值语句的左侧),而后者似乎认为
i
是有效的final(因为
final int i;i=3;
是完全有效的)。规范中的其他东西解决了这个明显的差异吗?为了简单起见,我留下了另一种方式的引用,在拆分声明/单个赋值的情况下,它可以成为有效的最终形式。我会把它包括进去……啊,我明白了;谢谢我认为你喜欢简洁是对的。也许只需将第二个要点保留为“声明器缺少初始值设定项的局部变量实际上是final if[…]”——也就是说,将“if”一词后面的所有内容替换为“[…]”?(哦,顺便说一下,还有+1。)
while (true){
    Socket s = serverSocket.accept();
    // some code here ... we don't assign anything to s again here ... 
}