Порядок загрузки классов управления в Java - PullRequest
0 голосов
/ 12 апреля 2009

Я создал класс, который содержит множество значений свойств. Чтобы инициализировать этот класс, мне нужно вызвать некоторый статический метод «configure ()», который настраивает его из файла XML.

Этот класс должен был действовать, чтобы хранить некоторые данные, чтобы я мог просто написать

PropClass.GetMyProperty();

Я вызываю configure() из статического блока в главном, чтобы я мог использовать его где угодно

НО

Если я установил для статического константного члена какого-либо другого класса значение из моего «PropClass», я получу ноль,

class SomeClass {

   static int myProp = PropClass.GetMyProperty();

}

Это возможно потому, что это выражение оценивается перед вызовом configure. Как я могу решить эту проблему?

Как я могу обеспечить, чтобы вызов configure() был выполнен первым? Спасибо

Ответы [ 4 ]

5 голосов
/ 12 апреля 2009

вы можете использовать статический блок кода, чтобы сделать это

static {
   configure();
}

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

2 голосов
/ 12 апреля 2009

Я бы сделал следующее:

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();
}

Также. если возможно, не делайте все статичным - по крайней мере, используйте singleton .

0 голосов
/ 12 апреля 2009

Чувак, звучит так, как будто ты должен использовать Spring Framework (или какую-либо другую платформу Dependency Injection). Весной вы уже получаете все, что вам нужно:

  • Формат XML для определения bean-компонентов с настраиваемыми свойствами, нет необходимости кодировать логику для чтения XML и инициализации bean-компонентов самостоятельно.
  • Бины инициализируются, когда они вам нужны (при условии, что вы обращаетесь к ним правильным образом). Наилучшим способом было бы ввести бобы в вызывающие объекты.

Не изобретайте колесо ... Spring - одна из наиболее часто используемых сред в Java. ИМХО, ни одно большое Java-приложение не должно быть написано без него.

0 голосов
/ 12 апреля 2009

Не можете ли вы заставить метод GetMyProperty() проверить, был ли уже вызван configure()? Таким образом, вы можете вызывать GetMyProperty(), не беспокоясь о том, настроен ли наш объект. Ваш объект позаботится об этом за вас.

, например

public String getMyProperty() {
   if (!configured) {
      configure();
   }
   // normal GetMyProperty() behaviour follows
}

(вы должны синхронизировать все вышеперечисленное, если вы хотите быть потокобезопасным)

...