Подтвердить что ты не робот

В чем смысл этого блока кода в java?

В чем смысл создания такого кода в Java? Существует ли это по какой-то определенной причине или это просто побочный результат других решений Java-дизайна? Разве вы не можете использовать конструирующее средство для достижения того же эффекта?

class Student
{
    {
        System.out.println("Called when Student class is instantiated.");
    }
}
4b9b3361

Ответ 1

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

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

Ответ 2

Он назвал блок инициализации .

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

Ответ 3

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

upd и, конечно, двойная инициализация скобок, например

List<Integer> answers = new ArrayList<Integer>(){{add(42);}}

Ответ 4

Это блок инициализации. Как упоминалось Matt Ball, они копируются в каждый конструктор.

Вам может быть интересно узнать о статических инициализационных блоках (также в разделе ):

public class Foo {
    static {
        System.out.println("class Foo just got initialized!");
    }

    {
        System.out.println("an instance of Foo just got initialized!");
    }
}