Чем инициализатор экземпляра отличается от конструктора? - PullRequest
71 голосов
/ 31 августа 2009

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

Ответы [ 6 ]

100 голосов
/ 31 августа 2009

Это, кажется, объясняет это хорошо:

Инициализаторы экземпляра являются полезной альтернативой переменной экземпляра. инициализаторы всякий раз, когда:

  • код инициализатора должен перехватывать исключения, или

  • выполнить причудливые вычисления, которые нельзя выразить инициализатором переменной экземпляра. Конечно, вы всегда можете написать такой код на конструкторы.

Но в классе, который имеет несколько конструкторов, вам придется повторять код в каждом конструкторе. С инициализатором экземпляра вы можно просто написать код один раз, и он будет выполнен независимо от того, что Конструктор используется для создания объекта. Инициализаторы экземпляра также полезно в анонимных внутренних классах, которые не могут объявить Конструкторы вообще.

От: JavaWorld Инициализация объекта в Java .

20 голосов
/ 31 августа 2009

С точки зрения жизненного цикла объекта разницы нет. Оба активируются во время построения, и логически блок инициализатора можно считать частью построения.

Семантически, инициализатор - это хороший инструмент по нескольким причинам:

инициализатор может улучшить читаемость кода, если оставить логику инициализации рядом с инициализируемой переменной:

   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
       }
   }

Инициализаторы вызываются независимо из которых используется конструктор.

Инициализаторы могут использоваться в анонимных внутренние классы, где конструкторы не могу.

8 голосов
/ 31 августа 2009

Если у вас много конструкторов и вы хотите, чтобы для каждого конструктора выполнялся некоторый общий код, вы можете использовать экземпляр initializer. Как он вызывается для всех конструкторов.

4 голосов
/ 09 июня 2016

Реальное преимущество инициализаторов экземпляров над конструкторами проявляется, когда мы используем анонимный внутренний класс .

У анонимных внутренних классов не может быть конструктора (поскольку они анонимны) , , поэтому они вполне естественны для инициализаторы экземпляров .

4 голосов
/ 31 августа 2009

Я бы вообще не использовал идиому инициализатора экземпляра - единственное реальное преимущество, которое он дает перед инициализаторами переменных, - это обработка исключений.

И поскольку метод init (вызываемый из конструктора) также может выполнять обработку исключений, а также централизовать код установки конструктора, но имеет то преимущество, что он может работать со значениями параметров конструктора, я бы сказал, что инициализатор экземпляра является избыточным, и поэтому следует избегать.

0 голосов
/ 18 октября 2015

Initializer - это способ обмена кодом между конструкторами, который делает код более читабельным, если инициализатор используется с объявлением переменной.

Компилятор Java копирует блоки инициализатора в каждый конструктор. Следовательно, этот подход можно использовать для совместного использования блока кода между несколькими конструкторами. Документация Oracle

...