Следующий код не будет компилироваться, потому что компилятор не гарантирует, что поле данных f
будет инициализировано. Как вы это исправите?Как инициализировать поле данных внутри цикла?
импорт java.util.Scanner;
public class Foo
{
private final int f;
/*constructor*/
public Foo()
{
Scanner sc = new Scanner(System.in);
for(int i = 0; i < 10; i++)
{
if(i == 5)
f = sc.nextInt();//error: variable f might be assigned in a loop
}
}
public Foo(int i)
{
j = i;//no problem
}
}
Не является ли это своего рода глюк в языке, потому что в моем другом конструкторе я могу иметь f
набор для final
и только потому, что это не сделано в цикле он работает. Я знаю, что компилятор (будучи немым) видит цикл и думает, что f
будет переназначен, но логика в программе гарантирует, что это произойдет только один раз. Является ли это примером того, как Java «защищает» программатора?
Для всех интересно, почему f
был объявлен окончательным Netbeans, предположил это, предположительно, когда код был сильно иным.
почему й финал? когда вы выполняете итерацию и присваиваете ей значение в другое время? – Hrishikesh
Капля "финала"? – Fildor
Причина в том, что f является окончательным. – Hrishikesh