这是一些示例代码(假设Java 8)。
while (true){
Socket s = serverSocket.accept();
// some code here ... we don't assign anything to s again here ...
}
s
在循环中是否有效最终?
答案 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
。如果是这样,它实际上是最终的。