Можно ли инициализировать окончательное значение в методе, который вызывается внутри конструктора?
Нет, это невозможно.
Это должно быть инициализировано прямо в конструкторе?
Он должен быть инициализирован в конце каждого конструктора. Инициализация может быть выполнена в объявлении или в инициализаторе экземпляра ..., который выполняется как часть всех конструкторов.
То есть это рассматривается как задание? Да?
Да!
Проблема в том, что метод можно вызывать в любой точке:
- конструктор может вызвать его дважды,
- он может быть вызван после того, как объект был построен, или
- он может выдать исключение до / после назначения, оставляя неясным, произошло ли назначение. (И конструктор может поймать исключение ...)
Вместо того, чтобы требовать от компилятора сложного анализа, чтобы убедиться, что назначение происходит один и только один раз во время построения (а не после построения), JLS просто запрещает назначение в этом контексте.
Есть ли способ разбиения конструктора для достижения того, чего я хотел?
Вы можете вычислить значения в отдельном методе, но фактическая инициализация final
должна быть выполнена в конструкторах, инициализаторе объявлений или блоке инициализатора.
(Если в кадре были подклассы, есть другие приемы, которые можно было бы использовать.)