Чем инициализатор экземпляра отличается от конструктора?
другими словами, Зачем вам нужен инициализатор экземпляра? Какая разница или преимущество у вас есть при написании инициализатора экземпляра над конструктором?
6 ответов
Это, кажется, хорошо объясняет это:
инициализаторы экземпляра являются полезной альтернативой переменной экземпляра инициализаторы всякий раз:
код инициализатора должен перехватывать исключения или
выполнять причудливые вычисления, которые не могут быть выражены с помощью инициализатора переменной экземпляра. вы могли бы, конечно, всегда писать такой код в проектировщики.
но в классе с несколькими конструкторами вам придется повторить код в каждом конструкторе. С инициализатором экземпляра, вы можно просто написать код один раз, и он будет выполнен несмотря ни на что конструктор используется для создания объекта. Инициализаторы экземпляра также полезно в анонимных внутренних классах, которые не могут объявлять конструкторы вообще.
From: JavaWorld инициализация объекта в Java.
С точки зрения жизненного цикла объекта, нет никакой разницы. Оба вызываются во время построения, и логически блок инициализатора можно считать частью построения.
семантически инициализатор-хороший инструмент по нескольким причинам:
инициализатор может улучшить читаемость кода, сохраняя логику инициализации рядом с переменной инициализации:
public class Universe {
public int theAnswer;
{
int SIX = 6;
int NINE = 7;
theAnswer = SIX * NINE;
}
// a bunch of other vars
}
vs
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
}
}
инициализаторы вызываются не обращающий внимания из которых используется конструктор.
инициализаторы можно использовать в anonymous внутренние классы, где конструкторы не могу.
когда у вас много конструкторов и вы хотите, чтобы для каждого конструктора выполнялся общий код, вы можете использовать инициализатор экземпляра.Как это называется для всех конструкторов.
Я бы избегал идиомы инициализатора экземпляра в целом - единственное реальное преимущество, которое он дает над инициализаторами переменных, - это обработка исключений.
и поскольку метод init (вызываемый из конструктора) также может выполнять обработку исключений, а также централизует код настройки конструктора, но имеет то преимущество, что он может работать со значениями параметров конструктора, я бы сказал, что инициализатор экземпляра является избыточным и поэтому его следует избегать.
на реальное преимущество инициализаторов экземпляра над конструкторами видно, когда мы используем анонимный внутренний класс.
анонимные внутренние классы не могут иметь конструктор (поскольку они анонимны), так они довольно естественно подходят для инициализаторы экземпляра.
инициализатор-это способ обмена кодом между конструкторами, и он делает код более читаемым, если инициализатор используется с объявлением переменной.
компилятор Java копирует блоки инициализатора в каждый конструктор. Поэтому этот подход можно использовать для совместного использования блока кода между несколькими конструкторами. документация Oracle