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


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

6 67

6 ответов:

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

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

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

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

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

От: 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
       }
   }

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

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

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

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

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

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

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

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

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