Java: что статично {}?

Ruby делает систему, назван граблями: http://rake.rubyforge.org/

довольно многообещающие Взгляды.

всегда существует Муравей: http://ant.apache.org , который я лично нахожу ужасающими. Это - фактический стандарт для разработки Java, как бы то ни было.

6
задан Cœur 15 August 2017 в 05:57
поделиться

4 ответа

Статический блок называется статическим инициализатором класса - он запускается при первой загрузке класса (и это единственный раз [сноска]).

Цель этого конкретного блока - проверить, находится ли драйвер MySQL в пути к классам (и выдать / записать ошибку, если это не так).


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

14
ответ дан 8 December 2019 в 04:30
поделиться

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

В отличие от конструкторов, например, статические инициализаторы не наследуются и выполняются только один раз, когда класс загружается и инициализируется JRE. В приведенном выше примере переменная класса foo после завершения инициализации будет иметь значение 998877.

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

8
ответ дан 8 December 2019 в 04:30
поделиться

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

final static String JDBC_DRIVER = getJdbcDriver( );

static
{
  try
  {
    Class.forName(JDBC_DRIVER);
  }
  catch ( ClassNotFoundException exception )
  {
    log.error( "ClassNotFoundException " + exception.getMessage( ) );
  }
}

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

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

class MyClass
{
  final int intVar;

  {
    intVar = 1;
  }
}

В общем случае в их использовании в некоторой степени нет необходимости из-за конструктора, но они полезны при реализации версии замыканий Java.

1
ответ дан 8 December 2019 в 04:30
поделиться

Блок статического инициализатора выполняется всякий раз, когда класс должен быть загружен в первый раз. Это может произойти, если что-то на более высоком уровне выполняет Class # forName ("yourpackage.YourClass") или new YourClass () в рассматриваемом классе впервые.

По совпадению, у приличных драйверов JDBC тоже есть что-то похожее внутри. В частности, они регистрируются в DriverManager с использованием статического блока инициализатора:

static {
    DriverManager.registerDriver(new ThisDriver());
}

, так что всякий раз, когда вы выполняете Class.forName ("somepackage.ThisDriver") , вы эффективно регистрируете драйвер в DriverManager , чтобы впоследствии можно было установить соединение с ним.

1
ответ дан 8 December 2019 в 04:30
поделиться
Другие вопросы по тегам:

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