Это полностью зависит от того, как класс предназначен для использования.
Один из примеров - классы значений, которые вы часто можете использовать как неизменяемые. В идеале в этом случае вы должны установить значения в конструкторе.
public final class Foo {
private final String foo;
public Foo(String foo) {
this.foo = foo;
}
}
Если есть действительно разумные значения по умолчанию, вы можете указать их в пункте объявления. Как правило, довольно легко увидеть ожидаемое значение по умолчанию.
Конечно, это не работает с окончательными полями (как указано выше), так как невозможно назначить другое значение.
Другое соображение связано с относительными достоинствами инициализации конструктора или мутатора. Использование инициализации конструктора гарантирует, что экземпляр никогда не будет в несовместимом состоянии, в то время как инициализация мутатора часто является более гибкой и предоставляет более простой API.
В первоначальном замечании о том, как избежать NPE
s, я бы сказал, что это лучше всего решить, используя инициализацию конструктора, в соответствии с приведенным выше кодом.