Если ли в 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 шт):
Java создаёт дефолтный конструктор только, если вы явно не напишете хотя бы один свой конструктор. Вы можете написать что-то наподобие такого:
class Example {
private String foo;
public Example(String foo) {
this.foo = foo;
}
}
В таком случае Java не будет создавать дефолтный конструктор, а для создания экземпляра класса вам обязательно потребуется задать параметр foo
Да, в 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).