TL; DR Для этой функции нет нормального использования.Если бы я увидел это в обзоре кода, я бы заставил автора реорганизовать его.
Иногда спецификация Java позволяет вам писать вещи, которые вы не должны делать в нормальном рабочем кодеи, для меня, это один пример.
Давайте попробуем вывести фрагмент кода, который использует эту функцию.
Нам разрешено использовать ключевое слово abstract
в статическомблок инициализации.Это можно сделать только при определении класса, объявив сам класс abstract
и, возможно, некоторые его методы.
Этот класс не виден за пределами блока инициализации, поэтому мы можем сделать вывод, чтоЯ буду использовать его внутри.abstract
- это создание экземпляров или определение методов экземпляров.Таким образом, это полезно, только если мы планируем создавать экземпляры абстрактного класса.
Теперь класс является абстрактным, поэтому, чтобы иметь возможность создавать экземпляры, нам нужен хотя бы один подкласс.
Если у нас есть только один подкласс, зачем разделять его функциональность на абстрактный родительский и один дочерний класс?Это было бы излишне сложно, поэтому мы можем предположить, что у нас есть несколько дочерних классов.
Итак, чтобы любое (хотя бы наполовину) использование ключевого слова abstract
внутри статического блока инициализации, этот блок долженопределите один абстрактный родительский класс, несколько дочерних классов, а также код, который создает экземпляры этих классов, например, этот минимальный пример:
static private int value;
static {
abstract class Abstract {
abstract int method1();
}
class Child1 extends Abstract {
int method1() {
return 1;
}
}
class Child2 extends Abstract {
int method1() {
return 2;
}
}
Abstract instance1 = new Child1();
Abstract instance2 = new Child2();
value = instance1.method1() + instance2.method1();
}
ИМХО, использование статического инициализатора вообще должно быть исключением, и такой монстртребует рефакторинга, например, перемещая классы из блока инициализации, чтобы они стали обычными вложенными классами, или, что еще лучше, перемещая их в свои собственные файлы.
Единственный аспект этого шаблона абстрактного в инициализаторе отличается отРеорганизованные версии - это класс видимости.Вы получаете видимость, ограниченную только внутри блока static { ... }
.Но если ваш класс настолько сложный и длинный, что вы боитесь неправильного использования вне вашего static { ... }
блока, вы все равно проиграли ...