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

Уровень 4 выбора вводит :has() (ранее индикатор объекта !), который позволит вам выбрать предыдущего брата с:

previous:has(+ next) {}

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

71
задан Ajay 31 August 2009 в 04:39
поделиться

5 ответов

Кажется, это хорошо объясняет: инициализаторы всякий раз, когда:

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

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

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

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

100
ответ дан 24 November 2019 в 13:01
поделиться

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

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

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

Пример:

class MyClass{

    static int object_count = 0;

    MyClass(){
        object_count++;
    }

    MyClass(int i){

        object_count++;
    }

    void getCount() {

        System.out.println(object_count);
    }

    public static void main(String... args) {
        MyClass one = new MyClass();
        MyClass two = new MyClass(2);
        two.getCount();
    }
}

Вывод: 2

class MyClass{

    static int object_count = 0;

    {
        object_count++;
    }

    MyClass(){

    }

    MyClass(int i){     

    }

    void getCount() {

        System.out.println(object_count);
    }

    public static void main(String... args) {
        MyClass one = new MyClass();
        MyClass two = new MyClass(2);
        two.getCount();
    }
}

Вывод: 2

0
ответ дан 24 November 2019 в 13:01
поделиться

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

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

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

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

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

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

20
ответ дан 24 November 2019 в 13:01
поделиться

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

8
ответ дан 24 November 2019 в 13:01
поделиться

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

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

4
ответ дан 24 November 2019 в 13:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: