В Java мы можем инициализировать поле final
в конструкторах как в базовом классе, так и в его подклассах, а также во встроенном блоке инициализатора в базовом классе. Однако кажется, что мы не можем инициализировать поля final
во встроенном блоке инициализатора в подклассе. Это поведение в основном затрагивает анонимные классы, из которых нельзя вызывать конструкторы super
.
abstract class MyTest {
final protected int field;
public MyTest() {
// default value
field = 0;
}
}
MyTest anonymTest = new MyTest() {
{
// Error: The final field MyTest.field cannot be assigned
field = 3;
}
};
Есть ли способ инициализировать унаследованное поле final
в классе анонимуса?
Комментарий. Этот вопрос касается не конструкторов, а окончательной инициализации поля.
final
из подкласса, — это через суперконструктор. Так что этот дубликат охватывает единственную допустимую ситуацию для вашего вопроса. - person resueman   schedule 04.04.2016new Foo(){{a=1;b=2;}}
является более явным/понятным, чемnew Foo(1,2){}
. На самом деле исходная проблема заключается в том, что абстрактные классы не допускают неинициализированные поляfinal
. См.: stackoverflow.com/questions/2327509/ - person Dávid Horváth   schedule 04.04.2016new Foo() {{a=1; b=2;}}
более читабелен или понятен, чемnew Foo(1,2);
. Для более сложных случаев, связанных с инициализацией неизменяемых классов, Builders также очень просты для чтения и понимания, и они облегчают использование необязательных параметров. - person scottb   schedule 05.04.2016