Есть ли способ инициализировать окончательное поле в классе анонимуса? [Дубликат]

2

В 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 в классе анонимуса?

Комментарий. Этот вопрос касается не конструкторов, а конечной инициализации поля.

  • 0
    Речь идет не о конструкторах, а об окончательной инициализации поля.
  • 0
    Да, но единственная ситуация, в которой вы можете установить final поле из подкласса, - через супер-конструктор. Таким образом, этот дубликат охватывает единственную действительную ситуацию для вашего вопроса.
Показать ещё 5 комментариев
Теги:
inheritance
final

2 ответа

5

Вы должны инициализировать конечные переменные экземпляра либо во время объявления, либо в конструкторе. Однако вы можете предоставить значение конструктору

abstract class MyTest {

    final protected int field;

    public MyTest() {
        // default value
        this(0);
    }

    public MyTest(int f) {
        field = f;
    }

}


MyTest anonymTest = new MyTest(3) {
};

Обновление: добавлен конструктор для использования значения по умолчанию

1

Конечные переменные экземпляра должны быть инициализированы в конструкторе.

abstract class MyTest {

final protected int field;

public MyTest() {
    // default value
    field = 0;
}

public MyTest(int val)
{
   // will set the final field to the specified val
   field = val;
}

}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню