Каково обоснование этого блока кода в Java? - PullRequest
26 голосов
/ 04 марта 2011

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

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

Ответы [ 4 ]

48 голосов
/ 04 марта 2011

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

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

20 голосов
/ 04 марта 2011

Он называется блоком инициализатора .

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

5 голосов
/ 04 марта 2011

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

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

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

    {
        System.out.println("an instance of Foo just got initialized!");
    }
}
5 голосов
/ 04 марта 2011

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

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

List<Integer> answers = new ArrayList<Integer>(){{add(42);}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...