2009-08-31 3 views
61

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

+1

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

ответ

88

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

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

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

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

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

От: JavaWorld Object initialization in Java.

+14

С другой стороны, вы можете написать код один раз в одном конструкторе и просто вызвать его из всех других конструкторов. Но анонимные внутренние классы дают хорошую оценку. –

+10

Вы можете вызвать его из других конструкторов, но затем вы снова повторяете вызов. Если вы добавите новый конструктор, вы должны не забудьте добавить к нему вызов. Не так с инициализатором экземпляра. – talonx

+5

@talonx, я согласен с вашим аргументом о забывании, но использование поведения по умолчанию одинаково опасно. Когда сторонник читает конструктор в устаревшем коде, не всегда не забудьте проверить возможные инициализаторы экземпляра. В то время как явно используется init(), выделяется. – Assambar

7

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

18

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

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

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

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

У вас есть технически «инициализатор переменных экземпляра», а не «инициализатор экземпляра» (блок, непосредственно вложенный в класс). См. 3-й раздел JLS 8.6. –

+0

О, хорошо. Изменился пример. – ykaganovich

+0

Блок инициализатора экземпляра не имеет имени, как показано [здесь] (http://www.javatpoint.com/instance-initializer-block). Не так ли? Вы пометили свой код инициализатора экземпляра именем 'theAnswer'. Это верно? или я что-то упускаю. – RBT

4

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

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

+1

Вам нужно будет вручную вызвать метод init во ВСЕХ ваших конструкторах. – Stephan

+2

@Alex Хорошая точка, но поскольку большинство классов с несколькими конструкторами имеют общую логику, они, как правило, называют друг друга. По крайней мере, в большинстве моих классов. – CPerkins

0

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

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

4

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^