Если ли в Java механизм, обязывающий инициализовать поля класса в конструкторе?

Мой основной язык - TypeScript, и с опцией strictPropertyInitialization: true приведённый ниже код скомпилируется в JavaScript с ошибкой, если не проинициализировать foo в конструкторе.

class Example {

  // ошибка! Property 'foo' has no initializer and is not definitely assigned in the constructor.
  private foo: string;

  private constructor() {

  }

  private initializeFoo(foo: string): void {
    this.foo = foo;
  }

  private getFooLength(newPart: string): number {
    return this.foo.length;
  }
}

Есть ли подобный механизм в Java?


Ответы (2 шт):

Автор решения: Sergei Buvaka

Java создаёт дефолтный конструктор только, если вы явно не напишете хотя бы один свой конструктор. Вы можете написать что-то наподобие такого:

class Example { 

    private String foo;

    public Example(String foo) {
        this.foo = foo;
    }
}

В таком случае Java не будет создавать дефолтный конструктор, а для создания экземпляра класса вам обязательно потребуется задать параметр foo

→ Ссылка
Автор решения: Andrew Bystrov

Да, в java есть подобный механизм - это пометить поле как final. Тогда это поле можно будет объявить либо при описании, либо в конструкторе (или конструкторах, если у вас их несколько)

Код ниже скомпилируется успешно

class Example  {
    private final String name;

    public Example(String name) {
        this.name = name;
    }
}

А этот код уже не скомпилируется:

class Example  {
    private final String name;

    public Example() {

    }
}

Однако, у final есть ограничение - после того, как поле инициализировано, присваивать ему новое значение нельзя. В этом смысле, логика приведённого здесь кода неравносильна тому, что в вопросе (чтобы в TypeScript запретить присваивать новое значение, нужно пометить поле модификатором readonly).

→ Ссылка