Как инициализатор экземпляра отличается от конструктора?

Другими словами, зачем вам нужен инициализатор экземпляра? Какая разница или преимущество в написании инициализатора экземпляра над конструктором?

Ответ 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