В конструкторах классов можно будет писать код перед this() и super()

Недавно в репозитории проекта 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() ещё неявляется проинициализированным, на код будут накладываться некоторые ограничения. Например, этот код не сможет использовать поля класса и нестатические методы.

Подписывайтесь на канал в Telegram, чтобы не пропускать новости.

Все материалы на этом сайте выложены под лицензией CC BY-SA 4.0
© Евгений Козлов, 2017-2024
Feed
Table of JEPs