Некоторые вопросы относительно блока инициализации в Java - PullRequest
2 голосов
/ 24 апреля 2010
  1. Где вы чаще всего использовали блок инициализации?
  2. Можно ли использовать их для присвоения значений статическим переменным экземпляра?
  3. Чем это отличается от назначения с помощью конструктора?
  4. Моя книга говорит, что блок инициализации выполняется, когда "класс загружен".Что означает загрузка класса?

Дополнительный вопрос Что лучше?

class {static final instance-variable = val} 

или

class {static final instance-variable;  static {instance-variable=val}}

Ответы [ 2 ]

4 голосов
/ 24 апреля 2010

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

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

private static final String VAL1 = "VALUE";

Обновление , так как вы резко изменили вопрос, вот обновленный ответ:

1) Где вы чаще всего использовали блок инициализации?

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

2) Можете ли вы использовать их для присвоения значений статическим переменным экземпляра?

Вам понадобится static блок инициализатора.

private static final String FOO;

static {
    FOO = "bar";
}

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

static {
    try {
        FOO = getItSomehow();
    } catch (Exception e) {
        throw new ExceptionInInitializerError(e);
    }
}

3) Чем это отличается от назначения с помощью конструктора?

Он всегда назначается независимо от используемого конструктора.

4) Моя книга говорит, что блок инициализации выполняется, когда «класс загружен». Что означает загрузка класса?

Книга на самом деле говорит о статическом блоке инициализации. Класс обычно загружается, когда вы впервые ссылаетесь на него в своем коде. Вы также можете принудительно загрузить его с помощью Class#forName() (как, например, драйверы JDBC). Я отправил ответ с большим количеством примеров и объяснений до здесь .

Надеюсь, это поможет.

1 голос
/ 24 апреля 2010

Дополнительный вопрос Что лучше?

class {static final instance-variable = val} 

или

class {static final instance-variable;  static {instance-variable=val}}

Они ведут себя одинаково. В этом случае первая форма лучше, так как она менее многословна и, несомненно, легче читается.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...