Порядок загрузки классов управления в Java
Я создал класс, который содержит множество значений свойств. Чтобы инициализировать этот класс, мне нужно вызвать некоторый статический метод "configure()", который настраивает его из файла XML.
Этот класс должен был действовать, чтобы хранить некоторые данные, чтобы я мог просто написать
PropClass.GetMyProperty();
Я звоню configure()
из статического блока в основном, чтобы я мог использовать его в любом месте
НО
Если я устанавливаю статический константный член некоторого другого класса в значение из моего "PropClass", я получаю ноль,
class SomeClass {
static int myProp = PropClass.GetMyProperty();
}
Это, вероятно, потому, что это выражение оценивается до вызова настройки. Как я могу решить эту проблему?
Как я могу обеспечить, чтобы призыв к configure()
будет исполнен первым? Спасибо
4 ответа
Вы можете использовать статический блок кода, чтобы сделать это
static {
configure();
}
синтаксис статического блока инициализатора? Все, что осталось, это ключевое слово static и пара соответствующих фигурных скобок, содержащих код, который должен быть выполнен при загрузке класса. взяты отсюда
Я бы сделал следующее:
class SomeClass
{
// assumes myProp is assigned once, otherwise don't make it final
private final static int myProp;
static
{
// this is better if you ever need to deal with exceeption handling,
// you cannot put try/catch around a field declaration
myProp = PropClass.GetMyProperty();
}
}
тогда в PropClass сделайте то же самое:
class PropClass
{
// again final if the field is assigned only once.
private static final int prop;
// this is the code that was inside configure.
static
{
myProp = 42;
}
public static int getMyProperty();
}
Также. если возможно, не делайте все статичным - по крайней мере, используйте синглтон.
Вы не можете сделать GetMyProperty()
метод проверки configure()
уже звонили? Таким образом, вы можете позвонить GetMyProperty()
не беспокоясь о том, настроен ли наш объект. Ваш объект позаботится об этом за вас.
например
public String getMyProperty() {
if (!configured) {
configure();
}
// normal GetMyProperty() behaviour follows
}
(вы должны синхронизировать вышеупомянутое, если вы хотите быть потокобезопасным)
Чувак, звучит так, будто ты должен использовать Spring Framework (или какую-то другую платформу Dependency Injection). Весной вы уже получаете все, что вам нужно:
- Формат XML для определения bean-компонентов с настраиваемыми свойствами, нет необходимости кодировать логику для чтения XML и инициализации bean-компонентов самостоятельно.
- Бины инициализируются, когда они вам нужны (при условии, что вы обращаетесь к ним правильным образом). Лучшим способом было бы ввести бобы в вызывающих.
Не изобретайте колесо... Spring - одна из наиболее часто используемых сред в Java. ИМХО, ни одно большое Java-приложение не должно быть написано без него.