Другими словами, зачем вам нужен инициализатор экземпляра? Какая разница или преимущество в написании инициализатора экземпляра над конструктором?
Как инициализатор экземпляра отличается от конструктора?
Ответ 1
Это, похоже, хорошо объясняет:
Инициализаторы экземпляров являются полезной альтернативой переменной экземпляра инициализаторы всякий раз:
код инициализатора должен улавливать исключения или
выполняют причудливые вычисления, которые не могут быть выражены с помощью инициализатора переменной экземпляра. Конечно, вы всегда можете написать такой код в Конструкторы.
Но в классе с несколькими конструкторами вам придется повторять код в каждом конструкторе. С инициализатором экземпляра вы может просто написать код один раз, и он будет выполнен независимо от того, что конструктор используется для создания объекта. Инициализаторы экземпляра также полезен в анонимных внутренних классах, которые не могут объявить какие-либо конструкторы вообще.
От: JavaWorld Инициализация объектов в Java.
Ответ 2
В терминах жизненного цикла объекта нет никакой разницы. Оба вызываются во время построения, и логически блок инициализатора можно считать частью конструкции.
Семантически, инициализатор - отличный инструмент для нескольких причин:
инициализатор может улучшить читаемость кода, сохраняя логику инициализации рядом с инициализируемой переменной:
public class Universe {
public int theAnswer;
{
int SIX = 6;
int NINE = 7;
theAnswer = SIX * NINE;
}
// a bunch of other vars
}
против
public class Universe {
public int theAnswer;
// a bunch of other vars
public Universe() {
int SIX = 6;
int NINE = 7;
theAnswer = SIX * NINE;
// other constructor logic
}
}
Инициализаторы вызывают независимо из которых используется конструктор.
Инициализаторы могут использоваться в анонимных внутренние классы, где конструкторы не может.
Ответ 3
Когда у вас много конструкторов и вы хотите, чтобы какой-то общий код выполнялся для каждого конструктора, вы можете использовать инициализатор экземпляра. Поскольку он вызывается для всех конструкторов.
Ответ 4
Я бы избегал идиомы инициализатора экземпляра вообще - единственным реальным преимуществом, которое он дает над инициализаторами переменных, является обработка исключений.
И поскольку метод init (вызываемый из конструктора) также может выполнять обработку исключений, а также централизует код установки конструктора, но имеет то преимущество, что он может работать с значениями параметров конструктора, я бы сказал, что инициализатор экземпляра избыточен и поэтому их следует избегать.
Ответ 5
реальное преимущество инициализаторов экземпляров над конструкторами рассматривается, когда мы используем анонимный внутренний класс.
Анонимные внутренние классы не могут иметь конструктор (поскольку они анонимны) , , поэтому они довольно естественны для инициализаторы экземпляров.
Ответ 6
Инициализатор - это способ совместного использования кода между конструкторами и делает код более читаемым, если инициализатор используется с объявлением переменной.
Компилятор Java копирует блоки инициализации в каждый конструктор. Поэтому этот подход может использоваться для совместного использования блока кода между несколькими конструкторами. Документация Oracle