Недавно в репозитории проекта Amber появился коммит, который позволит писать инструкции кода выше вызовов this()
и super()
в конструкторах. Сейчас this()
и super()
обязательно должны быть первыми вызовами в конструкторах, что часто создаёт неудобства при написании кода, например, если необходимо сделать какую-то нетривиальную валидацию входных аргументов или просто вынести в переменные слишком длинные выражения:
public class TxtFile extends File { public TxtFile(String path) { if (!path.endsWith(".txt")) { throw new IllegalArgumentException("Not a txt file"); } super(path); } }
Кроме того, возможность писать код перед вызовом конструктора также сильно поможет при написании data-классов. При компиляции data-класса компилятор будет создавать конструктор по умолчанию, который не будет делать никакой другой работы кроме инициализации полей. Чтобы добавить в инициализацию класса какую-то более сложную логику, нужно будет объявить свой конструктор, в котором необходимо вызвать конструктор по умолчанию посредством ключевого слова default()
(аналогично this()
и super()
).
Так как объект до вызова this()
/ super()
/ default()
ещё неявляется проинициализированным, на код будут накладываться некоторые ограничения. Например, этот код не сможет использовать поля класса и нестатические методы.