Статическая инициализация выполняется для каждого класса. Поэтому вопрос, который вам может потребоваться задать самому себе, - это статическая инициализация этого класса? ». Из вашего примера использования похоже, что статическая инициализация IDRegistry запускается перед любым из классов, которые регистрируются. Вы можете использовать другой подход и посмотреть на что-то еще, что вы хотите применить к тому, что можно добавить в реестр.
BTW вы обнаруживаете в процессе инициализации одного класса, используя конечную переменную, которую вы объявляете в самом начале в классе, а затем устанавливаете в статическом блоке в самом конце класса. Поскольку статическая инициализация выполняется в исходном порядке, любой код, выполняемый как часть статической инициализации классов, будет видеть значение по умолчанию java для типа (т.е. false, 0, null), а любой код, выполняемый после статической инициализации, увидит окончательный набор стоимость.
class AClass {
static final boolean staticInitDone;
// Any static initialization done here will see
// staticInitDone as false, e.g. the
// Y constructor below would see false.
static X = new Y();
static {
staticInitDone = true;
}
}
Но вы заметите, что это не подходит для координации кросс-класса, которую вы хотите.
Не могли бы вы расширить свой прецедент немного больше? Я почти уверен, что вам действительно не нужно что-то делать. –
Действительно, действительно плохая идея - но вы должны быть в состоянии сделать это с небольшим ходом и отражением стека. Но если вы не знаете, как это сделать, вероятно, это действительно хорошая идея, чтобы не попробовать этот материал. Я уверен, что если вы опишете, что вы на самом деле пытаетесь сделать, там будут лучшие способы. – Voo
simple - если метод вызывается вне статического инициализатора, он не подходит с точки зрения того, как этот метод предназначен для использования. просто проверить этот случай ошибки и отметить неправильное использование. – peterk